我有类似
的东西public void setCustomHandler(final List<ClassA> customHandler) {
this.customHandler = customHandler;
}
现在我创建一个classB并调用setCustomHandler(List<B>)
。 Eclipse告诉我创建
setCustomHandler(final List<ClassB> customHandler){
}
我如何才能分配
List<ClassB objects> to List<ClassA objects>?
答案 0 :(得分:3)
简短的回答:你不能。
List<ClassB>
不是List<ClassA>
的子类型(即使ClassB
是ClassA
的子类型):
List<ClassA> handlerList;
List<ClassB> bHandlers = new ArrayList<ClassB>();
handlerList = bHandlers; // Type mismatch: cannot convert from
// List<ClassB> to List<ClassA>
如果您拥有接收类的控制权,您可以让它接受List<? extends ClassA>
代替:
List<? extends ClassA> handlerList;
List<ClassB> bHandlers = new ArrayList<ClassB>();
handlerList = bHandlers; // Compiles fine.
答案 1 :(得分:2)
setCustomHandler(final List<? extends ClassA> customHandler){
}
这是简短的答案,答案很长:取决于你想要在setCustomHandler()
做什么。如果你想从列表中获取,那可行,但如果你想要列入列表,它将无法工作。原因是:List<? extends ClassA> customHandler
表示customHandler
包含ClassA的某个子类型,但您不知道哪一个会阻止您add
(您不知道列表中的内容) )。
如果你想列入你必须做的列表
setCustomHandler(final List<? super ClassA> customHandler){
}
表示customHandler
包含ClassA的某些超类型。这允许您放置ClassB,但不允许 get 。
有效Java 和来自Arnold的 Java编程语言解释了所有这些事情。
答案 2 :(得分:1)
你做不到。这就是阻止的泛型。
答案 3 :(得分:0)
您可以创建List<ClassA>
并设置ClassB
的对象,因为引用变量的类型为ClassA
,然后您可以调用需要调用的方法。< / p>
List<ClassA> list = new ArrayList<ClassA>();
ClassA object = new ClassB();
list.add(object);
setCustomerHandler(list);
这会对你有帮助。
答案 4 :(得分:0)
如果ClassA和ClassB没有任何关系,那么你就不能。如果它们处于相同的层次结构中(假设两者都继承自ClassC)则放置父类引用(ClassC)。
例如:
public ClassC{}
public ClassA<T extends ClassC> extends ClassC{
public void setCustomHandler(final List<T> customHandler) {
this.customHandler = customHandler;
}
}
答案 5 :(得分:0)
我不记得很多java,但我相信它是这样的:
创建List<ClassA>
并将所有ClassB项添加到其中:
List<ClassA> myList = new List<ClassA>();
myList.addAll(myListOfOtherItems);
现在您可以使用myList来调用您的方法,因为它的类型为List<ClassA>
,但包含扩展ClassA的ClassB项
答案 6 :(得分:0)
您遇到的问题是虽然ClassA
和ClassB
有特定关系,但List<ClassA>
和List<ClassB>
没有。{/ p>
您无法分配,而是必须逐个将第一个列表中的元素插入第二个列表。
答案 7 :(得分:0)
你不能。
您可以使用通配符?
,
void setCustomHandler(final List<?> customHandler)
但你必须以某种方式找出参数化类型。