ここに私が持っているものがあります:
public class Node<T> {
// instance variables
private Node<T> next;
private T data;
// construct with data
private Node(T data){
next = null;
this.data = data;
}
// construct without data
private Node(){
next = null;
this.data = null;
}
// static factory method
public static <T> Node<T> newNodeWithData(T data){
return new Node<T>(data);
}
// static factory method
public static <T> Node<T> newNode(){
return new Node<T>();
}
...
}
私の質問は、ジェネリックの構文と静的なファクトリメソッドの構文を組み合わせたものについてです。わかりませんなぜメソッド宣言の戻り値の型の前に<T>を置きます。タイプキャストのようなものですか?どんな助けでも大歓迎です!
このような砂糖で静的メソッドを装飾する必要があるのは、静的メソッドとして、クラスの宣言からT
を継承しないためです。
あなたも同じようにすることができます:
// static factory methods
public static <Q> Node<Q> newNode(){
return new Node<Q>();
}
public static Node<String> newStringNode(String s){
return new Node<String>(s);
}
宣言に対する簡単な説明は、次のことを支援します。
// This static method would have a <T> parameter to the class if it was not static
public static <T>
// It returns an object of type `Node` with generic parameter T
Node<T> newNode(){
// And here it is doing it's business.
return new Node<T>();
}
Node宣言内の元のT
はノードのインスタンスフィールドとメソッドにバインドされているため、これは静的メソッドをパラメーター化する唯一の方法です。したがって、次のように記述できます。
public static <T1> Node<T1> newNode(){
return new Node<T1>();
}
元のT
はNode
クラスのインスタンスにバインドされており、静的コンテキストで参照することはできません。これにより、コンパイルエラーが発生します。
// ERROR
public static Node<T> newNode(){
return new Node<T>();
}
<T>
は単なる信号であり、このメソッドは型変数としてT
を使用します。それがないと、コンパイラは、T
がどこかで宣言されてエラーを出力するclass
、interface
またはenum
であると考えます。最初の行で使用されているT
とは異なります。このメソッドのT
を他の文字に置き換えることができます。これは理解に役立つでしょう。
パラメータから推定されるT
public static <T> List<T> getNewListWithElement(T element)
コンパイラーは、クラスとしてのTとジェネリック引数としてのTをどのように区別できますか?解決策は、T要素がジェネリックであり、クラス/インターフェイスではないことを指定するために使用することです。
Tは使用法から推測
public static <T1> Node<T1> newNode(){
return new Node<T1>();
}
宣言が行われない場合、メソッド本体の中でT1になるのは誰ですか?