以下に示すように、メソッドの戻り値の前に<T>を追加する必要があるのはなぜですか?
public static <T> void test(T a){
System.out.println(String.format("test %s",a));
}
ご存じのとおり、Javaクラスオブジェクトでジェネリックスを使用する場合は、クラスを次のように定義する必要があります。
public class Test<T> {
private T a;
}
つまり、<T>
がクラス名の後に追加されます。静的メソッドでジェネリックスを使用する場合は、クラス宣言と同様に
する必要があるため、メソッドの戻り値の前に<T>を追加して、java meこの静的メソッドはジェネリック型を定義します。現時点
では、このジェネリック型をメソッドパラメータまたはメソッドで使用できます。
-------------------------------------------------- --------
次に、現時点でまだ疑問があります。静的メソッドはクラスのジェネリックスを直接使用できますか?
以下に示すように
public class Test<T> {
private T a;
public static void test(T a){
System.out.println(a);
}
}
答えは、それは、直接コンパイルエラーになる瞬間に、何で
エラーがから参照することはできません「xxxx.xxx.Xxxx.this」です (静的コンテキスト静的コンテキストから参照することはできません)、
そして、なぜこの問題があり、
私はそれがあると信じていませんClass <T>のメソッドは、newのオブジェクトが出てきたときに指定され
、staticメソッドは実際にはnewのオブジェクトなしで直接使用できます。現時点では、Class。Staticメソッドを使用するので、これはどのようなジェネリックですか。
したがって、パブリックスタティック<T> voidテストのみを使用して、ジェネリック型を事前に定義することができます
------------------------------- ---------------------------
もちろん、クラスでは、以下に示すように、非静的メソッドが独自のジェネリックを定義することもできます。
次に、次のコードによれば、ClassにはすでにTジェネリック型があり、メソッドにもTジェネリック型があります。このとき、どちらが使用されますか?
もちろん、これは最も近い場所の原則です。もちろん、メソッドでTジェネリックが使用されます。
public class Test<T> {
private T a;
public <T> T test(String a){
return (T)a;
}
}
-------------------------------------------------- --------
次の状況で何が起こるか考えてください
public static <T> T test(String a){
return (T)a;
}
public static void main(String[] args) {
System.out.println(test("123"));
}
私が得たコンパイルエラーは次のとおりです:
あいまいなメソッド呼び出しです
。PrintStreamのprintln
(char [])
とPrintStreamの
println
(String)の両方が
一致してい
ます。
なぜこれが起こるのですか?
戻り値をジェネリックTに設定し、Tのタイプを明示的に指定しないため、仮パラメーターを通じてTの特定のタイプを指定する必要があります。
もちろん、これは極端なケースです。通常、仮パラメーターを使用しますこれはジェネリック型として記述され、Tの特定の型は着信値によって動的に指定されます。
エラーがあった場合、コメントは私を修正するために歓迎されています、読んでくれてありがとう!