0

superジェネリックメソッド宣言で使用できない理由を理解しようとしていますか? 以下の例を参照してください。コンパイルされませんが、その理由はわかりません。

public class A<E> {
    public <T extends A> void test1(T t) {   // Compiles fine
    }
    public <T super A> void test2(T t) {     // Compilation error??
    }
    public <T super A> <T> void test3(T t) { // Compilation error??
    }
}

class A {}
....
4

2 に答える 2

2

メソッドが署名を持つことができるかどうか考えてみてください

public <T super A> void test2(T t) {
}

次に、任意のオブジェクトを引数として取ることができます。なんで?たとえば、いつでも ( は のスーパータイプである) と推論できTObject任意ObjectAオブジェクトは のインスタンスでObjectあるため、機能します。したがって、このように宣言するのはかなり冗長です。あなたはただ書くことができます

public void test2(Object t) {
}

同じ効果のために。

于 2012-06-24T08:15:53.090 に答える
2

型パラメーターと型引数には違いがあります。ワイルドカード (superおよびextends) の使用は、型引数用です。つまり、型パラメーターの対応する値を実際に定義するときに、呼び出しサイトでそれらを宣言します。または、キーワードextendsを型パラメーターの制約に使用できます。

型パラメーターと型引数

そのため、定義class List<T>{}Tは、 は型パラメーターと呼ばれます。type の参照を宣言する場合List、呼び出しサイトで の型引数を指定Tできます。これは、不変条件 (つまりList<String> jedis) または super または extends を使用したワイルドカード (つまりList<? extends Number> myNums, List<? super String> names) にすることができます。

型パラメータの制約

キーワードextendsは、特定の型パラメーターの制約を宣言するために、まったく異なる目的で使用することもできます。たとえば、宣言は次のとおりです。

class List<T extends CharSequence>{}

型パラメーターTは制約されています。これは、型パラメーターの型引数を宣言するときはいつでも、型またはそのサブタイプのいずれかTでなければならないことを意味します。CharSequence

それ自体List<String>は有効な宣言ですが、そうでList<Integer>はありません。

キーワードの使用は、super型パラメーター制約の宣言では許可されていません。おそらく、宣言ではあまり意味がないためです。それ自体Tではないための有効な型引数は何でしょうか?A

于 2012-06-24T02:39:59.977 に答える