10

これが間違っている理由:

    Class<? extends Number> type = Integer.class;
    ArrayList<type> = new ArrayList<>();

クラスオブジェクトを指定して特定のタイプのクラスをインスタンス化する方法はありませんか?


明らかに、私はそれを直接行うことは決してありません。それは、何が必要かを示すための単なる例です。実際のコードでは、タイプの名前がわかりません。例えば

    public void createAList(Class<? extends Number> type)  
{
    ArrayList<type> toReturn = new ArrayList<>();
    return toReturn;
}
4

7 に答える 7

9
<T extends Number> ArrayList<T> createAList(Class<T> type)  
{
    ArrayList<T> toReturn = new ArrayList<>();
    return toReturn;
}


ArrayList<Integer> intList = createAList(Integer.class);
于 2013-03-07T19:58:39.627 に答える
4

それはあなたがジェネリックを使用する方法ではありません。オブジェクトを使用せずClass、クラス名をコードで直接使用します。

ArrayList<Integer> = new ArrayList<>();
于 2013-03-07T19:50:43.193 に答える
3

Javaクラス(実際にはジェネリックでもある) オブジェクトとクラス名の違いを感じてください。

ジェネリック型を指定するクラス名を使用する必要があります。

ArrayList<Number> = new ArrayList<>();
// ArrayList<Number.class> = new ArrayList<>(); <- WRONG

更新:

実行時にしか型がわからない場合は、このアプローチを使用してください。

public <T extends Number> void createAList(Class<T> type) {
    ArrayList<T> toReturn = new ArrayList<>();
    return toReturn;
}
于 2013-03-07T19:54:34.437 に答える
2

は、保持するArrayList<>特定のタイプを持っている必要があります。ただし、そのタイプまたは任意のサブタイプのオブジェクトを入れることができます。

だから使用する

List<Number> = new ArrayList<Number>();

Integersそしてあなたはそれに入れることができます

等号の左側にあるインターフェイスと右側にあるクラスをどのように使用したかに注目してください。これは、ベストプラクティスのようなものです。

(あなたの例のように)ちょうど保持するリストが必要な場合Integerは、@irreputableによる答えが最善の策です。この答えは成り立ちますIntegerが、それだけではありませんInteger.

于 2013-03-07T19:52:50.220 に答える
1

引数を渡す必要さえありません:

public <T extends Number> ArrayList<T> createAList () {
    return new ArrayList<T>();
}

ただし、呼び出すときにtypeパラメーターを明示的に指定する必要がある場合があります。

ArrayList<Integer> intList = this.<Integer>createAList();
于 2013-03-07T23:19:09.313 に答える
1

文字通り、実装方法に関する他の回答の提案は、createAList重要なことを無視しています。型消去のため、そのような方法は無意味です。

が必要な場合は、次のList<? extends Number>ように記述できます。

List<? extends Number> lst = new ArrayList<>();

だけが必要な場合はList<?>、次のように記述できます。

List<?> lst = new ArrayList<>();

型パラメーターのスコープ内にTいてList<T>、 が必要な場合は、次のように記述できます。

List<T> lst = new ArrayList<>();

Class他の回答のメソッドと同様に、オブジェクトはこれらのコンストラクター呼び出しとは関係がないことに注意してください。これは、実行時に、ArrayListインスタンスがその参照が実行時に持っていたジェネリック型を認識していないか、気にしていないためです。

于 2013-03-07T21:06:11.213 に答える
0
ArrayList<type> = new ArrayList<>();

この行は間違っています。まず、ここで識別子 (変数名) を見逃していました。次に、「タイプ」と「クラス」の概念を混同しました。デリカできます

ArrayList<Integer> list = new ArrayList<>();

しかし、あなたによると、type = Integer.class. 明らかに、Integerと同等ではありませんInteger.classInteger.class i = 1;同様に、前者は「タイプ」、2 番目は「クラス」オブジェクトを持つことはできません。

ジェネリック メソッドを作成できます。

public <T extends Number> List<T> createAList (Class<T> type) {
    return new ArrayList<T>();
}
于 2013-03-07T20:24:03.603 に答える