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 の可能な回避策の 1 つ

   <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 に答える