使用通用方法,可以扩展多种类型,例如:
<T extends MyClass & MyInterface> void foo(T bar)
有没有办法使用扩展多个类型的参数指定List?
List<MyClass & MyInterface> myList;
不起作用......
这将允许以下内容:
class A extends MyClass implements MyInterface{}
class B extends MyClass implements MyInterface{}
myList.add(new A());
myList.add(new B());
MyClass c = myList.get(index);
MyInterface i = myList.get(index);
foo(myList.get(index));
答案 0 :(得分:3)
这绝对不可能,除非类型属于同一类型层次结构(在这种情况下,您将指定T extends TopMostBase
)。
如果可能的话,这基本上会打破泛型的整个想法(您也可以指定List<?> myList
并处理它,好像根本没有泛型,手动执行所有的类型检查。)
答案 1 :(得分:3)
答案是否定的。
根据您的语义期望,您会找到一种解决方法
foo的一种可行解决方法
<T extends MyClass> void foo(T bar) {
if (bar instanceof MyInterface) return;
}
可能最好的方法是创建一个提供两种类型的类型。 缺点是,所有有趣的类都需要从该类派生出来
abstract class MyClassInterface extends MyClass implements MyInterface {}
List<MyClassInterface> myList;
<T extends MyClassInterface> void foo(T bar)
只提供两种方法的天真方法会引起歧义,因此不可能(对于&#34; AND&#34;,对于&#34; XOR&#34;它将是有效的)
<T extends MyClass> void foo(T bar)
<T extends MyInterface> void foo(T bar)