web-dev-qa-db-ja.com

Java Generics and Static Factory Methods-Syntax

ここに私が持っているものがあります:

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>を置きます。タイプキャストのようなものですか?どんな助けでも大歓迎です!

21
FateNuller

このような砂糖で静的メソッドを装飾する必要があるのは、静的メソッドとして、クラスの宣言から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>();
}
8
OldCurmudgeon

Node宣言内の元のTはノードのインスタンスフィールドとメソッドにバインドされているため、これは静的メソッドをパラメーター化する唯一の方法です。したがって、次のように記述できます。

public static <T1> Node<T1> newNode(){
    return new Node<T1>();
}

元のTNodeクラスのインスタンスにバインドされており、静的コンテキストで参照することはできません。これにより、コンパイルエラーが発生します。

// ERROR
public static Node<T> newNode(){
    return new Node<T>();
}
5
Andrey Chaschev

<T>は単なる信号であり、このメソッドは型変数としてTを使用します。それがないと、コンパイラは、Tがどこかで宣言されてエラーを出力するclassinterfaceまたはenumであると考えます。最初の行で使用されているTとは異なります。このメソッドのTを他の文字に置き換えることができます。これは理解に役立つでしょう。

4
Sibbo

パラメータから推定されるT

public static <T> List<T> getNewListWithElement(T element)

コンパイラーは、クラスとしてのTとジェネリック引数としてのTをどのように区別できますか?解決策は、T要素がジェネリックであり、クラス/インターフェイスではないことを指定するために使用することです。

Tは使用法から推測

public static <T1> Node<T1> newNode(){
    return new Node<T1>();
}

宣言が行われない場合、メソッド本体の中でT1になるのは誰ですか?

0
danidacar