带有扩展多个类型的参数的列表

时间:2012-05-01 14:07:57

标签: java generics

使用通用方法,可以扩展多种类型,例如:

<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));

2 个答案:

答案 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)