1. ホーム
  2. java

[解決済み] (汎用)非静的型Tへの静的参照はできない

2022-02-12 21:46:21

質問

Demoクラスを実行すると、SomeClassのスタティックメソッドnewInstanceが呼び出され、コンストラクタとhelloの印刷が行われます。

メソッドを定義するには、戻り値の型とメソッド名、引数を指定します。

newInstanceの戻り値が <T>SomeClass<T> というのは、どうも変な気がします。 私のクラスは <T>SomeClass<T> ではなく SomeClass<T> と呼ばれているからです。

SomeClass<T> の前に <T> が必要な理由は何ですか? これを入れないと、よくあるエラーになるようです。 Cannot make a static reference to the non-static type T と呼ばれる。

もうひとつ、<T> と SomeClass<T> の間には多くのスペースを入れることができるので、一緒にする必要はなさそうです。

public class SomeClass<T> {

    public static <T>SomeClass<T> newInstance(Class<T> clazz){
        return new SomeClass<T>(clazz);
    }

    private SomeClass(Class<T> clazz){
        System.out.println("hello");
    }
}

public class Demo {

    public static void main(String args[])
    {
        SomeClass<String> instance = SomeClass.newInstance(String.class);
    }
}

解決方法は?

スタティックメソッドとは何ですか?特定のインスタンスではなく、クラスに対して動作するメソッドです。ジェネリックパラメータである T をクラスのシグネチャに追加します。 public class SomeClass<T> は特定のインスタンスに対してのみ有効です(そのため non-static type T ). 例. SomeClass<String> ここで [T = String] .

を含めることで <T> のメソッドシグネチャで public static <T>SomeClass<T> newInstance(Class<T> clazz) . つまり、このメソッドには汎用型の引数である T . この T とは別のものです。 T をクラスのシグネチャに追加します。ですから C すなわち public static <C> SomeClass<C> newInstance(Class<C> clazz) . または全く別のもの。

しかし、もしあなたが <T> を使おうとしているとコンパイラは判断します。 T をクラスのシグネチャに追加します。これは違法です。