- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我有一个简单的类
public class MyObject {
}
以及处理MyObject子类的handler接口(interface)
public interface MyObjectHandler<V extends MyObject>{
List<V> handle(List<V> objects);
}
假设,我有 BigObjects 和 SmallObjects(它们都扩展了 MyObject)并且我想为它们设置单独的处理程序。因此,我创建了两个具有特定泛型的 MyObjectHandler 接口(interface)。
class BigObject extends MyObject {}
class SmallObject extends MyObject {}
// Handlers interfaces
interface BigObjectHandler extends MyObjectHandler<BigObject>{}
interface SmallObjectHandler extends MyObjectHandler<SmallObject>{}
// Concrete handlers
class BigHandler1 implements BigObjectHandler {....}
class BigHandler2 implements BigObjectHandler {....}
class SmallHandler1 implements SmallObjectHandler {....}
class SmallHandler2 implements SmallObjectHandler {....}
现在假设我们已经创建了AbstractHandlerChain<...>
抽象类。因此,我们可以创建 BigHandlerChain 类并注入(inject)我们的 BigHandler(与 SmallHandlerChain 相同)。
class BigHandlerChain extends AbstractHandlerChain<BigObjectHandler> {
// Inject only childs of BigObjectHandler. E.g. via spring @Autowired
public BigHandlerChain(List<BigObjectHandler> handlers) {
this.handlers = handlers;
}
}
问题:是否有可能为这种情况创建完美的 AbstractHandlerChain?
public abstract class HandlerChain<T extends MyObjectHandler> {
private List<T> handlers;
public HandlerChain(List<T> handlers) {
this.handlers = handlers;
}
public <V extends MyObject> List<V> doChain(List<V> objects) {
for (T handler : handlers) {
objects = handler.handle(objects);
}
return objects;
}
}
这个有效,但在 handler.handle(objects)
我得到 Unchecked call to 'handle(List<V>)' as a member of raw type 'MyObjectHandler'
,所以我应该添加 @SuppressWarnings("unchecked")
那不是很好。
public abstract class HandlerChain<T extends MyObjectHandler<? extends MyObject>> {
...
public <V extends MyObject> List<V> doChain(List<V> objects) {
for (T handler : handlers) {
objects = handler.handle(objects);
}
return objects;
}
}
不起作用。在 handler.handle(objects)
我得到 handle (java.util.List<capture<? extends MyObject>>) cannot be applied to (java.util.List<V>)
.为什么在这种情况下我不能将对象传递给处理程序? Wildcard 扩展了 MyObject,V 扩展了 MyObject。还不够吗?
public abstract class HandlerChain<T extends MyObjectHandler<V>, V extends MyObject> {
...
public List<V> doChain(List<V> objects) {
for (T handler : handlers) {
objects = handler.handle(objects);
}
return objects;
}
}
这个可行,但在这种情况下,我应该将 BigHandlerChain 定义为 class BigHandlerChain extends AbstractHandlerChain<BigObjectHandler, BigObject>
.但是BigObjectHandler
已经包含关于类的信息,可以由它处理,所以它是信息重复。
public abstract class HandlerChain<T extends MyObjectHandler<V extends MyObject>> {
...
public List<V> doChain(List<V> objects) {
for (T handler : handlers) {
objects = handler.handle(objects);
}
return objects;
}
}
这里有一个解决方案,我期望从 java 中得到,但它不起作用!我不能这样声明类 ...class HandlerChain<T extends MyObjectHandler<V extends MyObject>
.为什么我在MyObjectHandler后面可以使用通配符,但是不能使用这个构造?
最佳答案
解决方案一
This one works, but in handler.handle(objects) I get Unchecked call to 'handle(List)' as a member of raw type 'MyObjectHandler', so I should add @SuppressWarnings("unchecked") that is not very good.
的确,因为 MyObjectHandler
是通用类型,但您没有在 HandlerChain
中指定它的类型的类型参数。
方案二
Doesn't work. In handler.handle(objects) I get handle (java.util.List>) cannot be applied to (java.util.List). Why I can't pass objects to handlers in this case? Wildcard extends MyObject and V extends MyObject. Isn't it enough?
没有。 ? extends MyObject
基本上说它是针对一些未指定的类型扩展 MyObject
,但你没有说是哪个。你可以创建一个类 public class BigHandlerChain<BigObjectHandler>
但提供 SmallObject
的列表实例到 doChain
.
方案三
This one works, but in this case I should define BigHandlerChain as class BigHandlerChain extends AbstractHandlerChain. But BigObjectHandler already contains information about classes, that can be handled by it, so it's information duplication.
确实,这里有一些重复的信息,但是当像这样组合泛型类型时,很可能会发生这种情况。由于您的 doChain
方法对某种类型进行操作,必须指定该类型可以做什么。将其视为您将要处理 BigObject
列表和您提供的处理程序必须能够处理 BigObjects。
解决方案 4
Here is a solution, that I expect from java, but it doesn't work! I can't declare class like this ...class HandlerChain. Why I can use wildcards after MyObjectHandler, but can't use this construction?
问题是 V
指示某种特定类型,而不是通配符,因此您需要指定 V 是什么。
换句话说,尽管有一些重复信息,您的解决方案 3 是正确的方法。不幸的是,您将在 Java 中看到更多此类内容。当字段上的特定修饰符关键字可以达到相同的效果时(就像在 Ruby 中一样),Getters/setters 可以说是不必要的样板文件。
但是请注意,如果您指定 public abstract class HandlerChain<T extends MyObjectHandler<V>, V extends MyObject>
,您将链指定为仅适用于一种特定类型的 MyObjectHandler
.由于我认为您可能需要一系列能够处理相同对象类型的不同处理程序,因此您最好只指定该对象类型:
public abstract class HandlerChain<V extends MyObject> {
private List<MyObjectHandler<V>> handlers;
public HandlerChain(List<MyObjectHandler<V>> handlers) {
this.handlers = handlers;
}
public List<V> doChain(List<V> objects) {
for (MyObjectHandler<V> handler : handlers) {
objects = handler.handle(objects);
}
return objects;
}
}
关于java - 类继承 : generic extends generic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43612264/
generic parameters of trait function 的简单示例: trait Ext: Sized { fn then(self, f: fn(Self) -> R) -
在下面的代码中,为什么 Groovy 似乎忽略了方法 barMany 中提供的闭包参数的泛型类型声明: import groovy.transform.CompileStatic @CompileSt
据我所知,Prolog 没有任何内置机制用于generic programming。 .可以使用统一来模拟泛型,但这需要在运行时进行类型检查: :- initialization(main). :-
在我的应用程序中,我有一个 Board。董事会由细胞组成。每个单元格都有一个 int 值。有几种类型的 Board 可以扩展 Board。每种类型的板将以不同方式表示单元格。例如,一个人会使用 Lis
我想将存储的属性添加到 UIView 子类中,例如UIView、UIImageView、UIPickerView等, 我只需要从子类创建 UIView 的实例子类仅类型不同,所有属性和方法都相同。 T
这个问题在这里已经有了答案: Any type and implementing generic list in go programming language (2 个答案) 关闭 6 个月前。
我有以下代码as seen in ideone.com : import java.util.*; class Test{ interface Visitor{ public
在 Swift 中,我们可以对序列等通用项编写扩展: extension Sequence where Iterator.Element : ObservableType { } 这将保证扩展仅适用于
我知道这听起来很困惑,但这是我能解释的最好的了。 (您可以建议一个更好的标题)。我有 3 节课:- A public class A > { ... } B public class B {
我目前在大学攻读 CS,我刚刚开始学习数据结构和算法类(class)。我的教授非常喜欢(实际上是强制我们)使用 Ada。为了取得成功,我开始查找一些东西并找到了这段代码,它描述了如何编写通用堆栈: g
我正在玩 Scala By Example 开头的 QuickSort 示例并尝试将其调整为通用类型 A ,而不仅仅是 Int s。 到目前为止我的工作是 def sort[A new Y(i, -
谁能解释为什么下面的第二个例子不能编译? “测试 2”给出“错误 FS0670:此代码不够通用。类型变量 ^a 无法泛化,因为它会超出其范围。”。我无法理解此错误消息。 // Test 1 type
如何将泛型存储在非泛型对象持有的泛型TList中? type TXmlBuilder = class type TXmlAttribute= class Name: Str
我正在尝试通过遵循 wiki article 创建如何使用 GHC.Generics 的最小工作示例.这是我所拥有的: {-# LANGUAGE DefaultSignatures, DeriveGe
我正在尝试将 get 函数添加到 wiki 中描述的通用序列化中。 。有些部分看起来很简单,但有一些地方我非常不确定要写什么,毫不奇怪,我遇到了编译错误。我已经查看了原始论文以及 cereal 中的实
为什么这段代码有效? $v):void { print_r($v); } test(Vector {1, array("I'm an array"), 3}); 它不应该抛出错误吗?什么是应
有没有办法让 Rust Generic 只接受原始类型?我想稍后迭代值中的位,并且我知道这只有在原始类型中才有可能。 struct MyStruct { my_property: T // m
假设我有一个简单的类 public class MyObject { } 以及处理MyObject子类的handler接口(interface) public interface MyObjectHa
出于某种原因,我正在努力通过使用通用基类来实现通用接口(interface)的属性,如下所示: public interface IParent where TChild : IChild {
我收到以下错误。 google了一天多,还是找不到具体的解决方法,求大神指点,谢谢 ERROR: Cannot implicitly convert type System.Collections.G
我是一名优秀的程序员,十分优秀!