5

私は次のようなものを持っています:

interface Foo<T> {
    //... lines [0,45]...

/*line 46*/ <R, X super T&R> List<X> weave(R value);
    //...
}

しかし、IntelliJ は次のように報告しています。

  1. エラー:(46, 18) java: > 予期される
  2. エラー:(46, 19) java: 不正なタイプの開始
  3. エラー:(46, 26) Java: '(' が必要です
  4. エラー:(46, 28) java: < 識別子 > が必要です
  5. エラー:(46, 29) Java: 'l' が必要です
  6. エラー:(46, 43) java: < 識別子 > が必要です

どうしたの?名前を下限にバインドすることはできませんか? またはR&X、上限でのみ式を使用できますか?

それをに変更する

interface Foo<T> {
    //... lines [0,45]...

/*line 46*/ <R> List<? super T&R> weave(R value);
    //...
}

収量

  1. エラー (46、31) java: > 予想
  2. エラー (46、32) Java: '(' が必要です
  3. エラー (46、33) java: 不正な型の開始
4

1 に答える 1

4

仕様を読んだところsuper、ワイルドカードでのみ使用でき、型変数にキャプチャすることはできません。JLS 4.5.1を参照してください。同様に、は型変数&でのみ有効であり、型引数では有効ではなく、型変数は を使用できません。super

それについて考えた後、これが私の説明です。型変数の理由は、型の安全性を向上させるために明示的なキャストを排除することです。型パラメーターを であると宣言するときsuper Foo、そのパラメーターがスーパークラスであっても問題ないと言っていますFoo。これは、それが を含むものである可能性があることを意味しObjectます。そのため、型がその境界を満たすオブジェクトについて何かを推定する安全な方法がなく、名前付き型変数内に含まれる情報がまったくないことを意味します。hashCode()ワイルドカードを使用してorを呼び出すことができますtoString()が、タイプ固有のものはありません。

于 2013-08-10T00:14:19.093 に答える