3

使用泛型方法可以扩展一种以上的类型,例如:

<T extends MyClass & MyInterface> void foo(T bar)

有没有办法用一个扩展多个类型的参数来指定一个列表?

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

2 回答 2

3

这绝对是不可能的,除非这些类型属于同一类型层次结构(在这种情况下,您将指定T extends TopMostBase)。

如果可能的话,这将基本上打破泛型的整个想法(您也可以指定List<?> myList和处理它,就好像根本没有泛型一样,手动进行所有类型检查。)

于 2012-05-01T14:11:14.403 回答
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)

仅提供两种方法的天真方法会导致歧义,因此这是不可能的(对于“AND”,对于“XOR”它是有效的)

<T extends MyClass> void foo(T bar)

<T extends MyInterface> void foo(T bar)
于 2012-05-01T14:11:36.850 回答