为什么我不能使用带通配符的多个类型参数?

时间:2013-12-12 11:46:48

标签: java generics

例如:为什么我不能这样做(I1和I2是两个接口):

 List<? extends I1 & I2> myList;

请注意,我不希望添加一个扩展I1和I2的新接口,因为它没有任何其他功能,只会是占位符

3 个答案:

答案 0 :(得分:4)

有两个原因:

首先是因为Java不支持多重继承。

第二个是因为这意味着您无法返回具有多种类型的对象。

例如想象一下myList.get(i)方法。您的示例中应该具有哪种返回类型?它必须是I1或I2,它不能是两者。

您可以定义一个实现I1和I2的接口然后使用它 - 但是添加到列表中的所有对象都需要实现新接口。添加实现I1和I2但不是新接口的东西仍然无效。

忘记泛型并尝试编写返回I1和I2的.get()方法存根 - 你不能这样做,它在Java中是不合法的。泛型不允许你这样做,因为没有办法将生成的代码转换为合法的Java代码。有关为什么Java仅支持单继承的更详细讨论,因为它是更大讨论的一部分。

答案 1 :(得分:2)

Java不支持它。您可以通过再定义一个interface I3来实现此目标,I1I2和{{1}}

答案 2 :(得分:1)

您可以定义自己的新界面,以获得相同的结果:

interface ABList<T extends A & B> extends List<T> {

}

....
ABList<X> abList = ...;

您必须记住,泛型是尝试扩展现有Java参数匹配系统。它更像是一种收紧编译时参数检查的方法,在这种情况下,您通常会尝试在运行时进行转换,并冒着类转换异常的风险。在泛型中使用?应该是非常罕见的。