11

次の一般的な境界を定義することは可能ですか?

  • インターフェイスを実装しますSomeInterface
  • あるクラスのスーパークラスですMyClass

何かのようなもの:

Collection<? extends SomeInterface & super MyClass> c; // doesn't compile
4

2 に答える 2

3

specによると、答えは no になります (superまたはを使用できますがextends、両方を使用することはできません):

タイプ引数:
    < TypeArgumentList >

TypeArgumentList:
    型引数
    TypeArgumentList 、 TypeArgument

タイプ引数:
    参照タイプ
    ワイルドカード

ワイルドカード:
    ? WildcardBoundsオプション

ワイルドカード境界:
    ReferenceType を拡張します
    スーパー参照タイプ
于 2013-01-02T20:29:43.203 に答える
2

変数を宣言するときに、ジェネリック型(Tあなたの場合)を境界とともに使用することはできません。

ワイルドカード ( ?) にするか、クラスの完全なジェネリック型を使用する必要があります。

例えば

// Here only extends is allowed
class My< T extends SomeInterface >
{

  // If using T, then no bounds are allowed
  private Collection<T> var1;

  private Collection< ? extends SomeInterface > var2;

  // Cannot have extends and super on the same wildcard declaration
  private Collection< ? super MyClass > var3;

  // You can use T as a bound for wildcard
  private Collection< ? super T > var4;

  private Collection< ? extends T > var5;

}

場合によっては、クラス (またはメソッド) にジェネリック パラメーターを追加し、その特定のパラメーターに境界を追加することで、宣言を強化することができます。

class My <
  T extends MyClass< I >,
  I extends SomeInterface 
>
{
}
于 2013-01-02T20:29:38.250 に答える