如何将List <classb>分配给一个以List <classa>和ClassB扩展ClassA的setter </classa> </classb>

时间:2011-06-27 13:04:04

标签: java generics

我有类似

的东西
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>?

8 个答案:

答案 0 :(得分:3)

简短的回答:你不能。

List<ClassB>不是List<ClassA>的子类型(即使ClassBClassA的子类型):

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

来自Bloch的

有效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)

您遇到的问题是虽然ClassAClassB有特定关系,但List<ClassA>List<ClassB>没有。{/ p>

您无法分配,而是必须逐个将第一个列表中的元素插入第二个列表。

答案 7 :(得分:0)

你不能。

您可以使用通配符?

void setCustomHandler(final List<?> customHandler) 

但你必须以某种方式找出参数化类型。