1

次の例を検討してください

class test<E>{
    public int getNum(int i){
        return i;
    }

    public E getNum1(E i){
        return i;
    }

    public static <E> E getNum(E i){
        return i;
    }
    }

最初のメソッド宣言: 戻り値の型はわかっています

2 番目のメソッド宣言: 戻り値の型が不明です

3 番目のメソッド宣言: 戻り値の型は不明 + 静的です

質問: ジェネリックに静的メソッドを使用する場合、型パラメーター<E>を指定する必要があります。なぜそうなのか、または型パラメータの意味とその目的は何ですか? メソッドが非静的の場合、型パラメーターはありませんが、この場合、次の<E>ようなクラス宣言があります。public class <E> {...}

ワイルドカードでこれを検討してください

//This does not compile, how to make it correct
    public static  getIndex(List<?>, int index){
        return list.get(index);
    }

    public static <E> E getIndex1(List<E> list, int index){
        return list.get(index);
    }

繰り返しますが、最初のメソッドはコンパイルされません。戻り値の型に無制限のワイルドカードを使用してコンパイルする方法がわかりません

上記の 2 つのメソッド宣言の違いは何ですか?

ワイルドカード?は任意のタイプをE示し、未知のタイプを示します。

any type正しいので、それはどのように重要some unknown typeですか?

4

1 に答える 1

5

質問: ジェネリックに静的メソッドを使用する場合、型パラメーターを指定する必要があります。なぜそうなのか、または型パラメータの意味とその目的は何ですか? メソッドが非静的の場合、型パラメーターはありませんが、この場合は public class {...} などのクラス宣言があります

staticメソッドはインスタンスに属しているのではなく、クラスに属しています。クラスにはジェネリック型がありません (インスタンスにはあります)。

だから持っていても意味がない

class test<E>{
    public static E getNum(E i){
        return i;
    }
}

あなたは得るでしょうCannot make a static reference to the non-static type E

クラス宣言の型パラメーターはインスタンス用です

test<String> anInstance = new test<String>();

これ

//This does not compile, how to make it correct
public static  getIndex(List<?>, int index){
    return list.get(index);
}

戻り値の型をList<?>指定しておらず、パラメーターに変数宣言がないためです。


any type正しいので、それはどのように重要some unknown typeですか?

次のようなジェネリック型宣言を行うと、

public class Test<E> {}

E未知のタイプではありません。これは、インスタンスの作成時に選択される明確に定義されたタイプです。

Test<String> test = new Test<>();

EですString

ルイス・ワッサーマンを引用する

E は、名前を付けて後で参照できる未知の型を示します。? 名前を付けておらず、後で参照できない未知の型を示します。


Generics に関する公式の Java チュートリアルを読むと、多くのことが得られます。

于 2013-09-06T19:03:47.337 に答える