例如:为什么我不能这样做(I1和I2是两个接口):
List<? extends I1 & I2> myList;
请注意,我不希望添加一个扩展I1和I2的新接口,因为它没有任何其他功能,只会是占位符
答案 0 :(得分:4)
有两个原因:
首先是因为Java不支持多重继承。
第二个是因为这意味着您无法返回具有多种类型的对象。
例如想象一下myList.get(i)方法。您的示例中应该具有哪种返回类型?它必须是I1或I2,它不能是两者。
您可以定义一个实现I1和I2的接口然后使用它 - 但是添加到列表中的所有对象都需要实现新接口。添加实现I1和I2但不是新接口的东西仍然无效。
忘记泛型并尝试编写返回I1和I2的.get()方法存根 - 你不能这样做,它在Java中是不合法的。泛型不允许你这样做,因为没有办法将生成的代码转换为合法的Java代码。有关为什么Java仅支持单继承的更详细讨论,因为它是更大讨论的一部分。
答案 1 :(得分:2)
Java不支持它。您可以通过再定义一个interface I3
来实现此目标,I1
将I2
和{{1}}
答案 2 :(得分:1)
您可以定义自己的新界面,以获得相同的结果:
interface ABList<T extends A & B> extends List<T> {
}
....
ABList<X> abList = ...;
您必须记住,泛型不是尝试扩展现有Java参数匹配系统。它更像是一种收紧编译时参数检查的方法,在这种情况下,您通常会尝试在运行时进行转换,并冒着类转换异常的风险。在泛型中使用?
应该是非常罕见的。