2017-08-08 5 views
1

私はJavaでCollection Frameworkを開始していますが、私は簡単なコードを持っていますが、ジェネリッククラスの可能性のある引数については興味があります。ジェネリッククラスの予期しないタイプのコンパイルエラー、それにはおそらくどのような引数がありますか?

ArrayList<String> names = new ArrayList<>(); 
             ^^ 


jdk1.7ので、あなたは、コードの重複を避けるためにdiamondオペレータ<>を使用することができます。

ListExa.java:6: error: unexpected type 
       ArrayList<int> names = new ArrayList<int>();  
required: reference 
found: int 
+2

'ArrayList'に' Integer'sまたは 'String'sを持たせますか? –

+0

このコードを 'Integer'sに編集しました –

+0

実際に私はなぜエラーが出されていないのですか?ジェネリッククラスの可能な引数について質問しました??投稿編集後に間違っている可能性のある回答をすべて編集しています。 –

答えて

2

これは全く新しい答えではありません。

Javaコレクションフレームワークでは、型パラメータ(山括弧内)として、コレクションに格納するオブジェクトの種類(ListSet、...)を指定します。

int,long,doubleなどのプリミティブ型を使用することはできません。参照型のみです。したがって、ArrayListに整数を格納する場合は、ArrayList<int>の代わりにArrayList<Integer>を実行する必要があります。

しかし、後でコードで、あなたのリストに文字列を追加したいとします。それを可能にするには、あなたのリストはArrayList<String>と宣言されるべきです。 ArrayList<Integer>は、Integer以外のものを追加しようとすると、コンパイルエラーが発生します。

もちろん、ArrayList<Object>を宣言することはできます。 (StringIntegerPersonFile、...)すべての種類のオブジェクトを受け入れますが、これはジェネリックの背後にある考え方に反しています。リストに許可するオブジェクトのタイプを可能な限り具体的に指示する奇妙なランタイムエラーを回避します)。

そして、それは後であなたがLinkedListまたはHashSetは、より良いあなたが、あなたのプログラムのニーズに合ったデータ構造であると判断した場合

List<String> names = new ArrayList<>(); 

または

Collection<String> names = new ArrayList<>(); 

ような何かを宣言するために良いスタイルです宣言の右側を変更するだけです。

2

import java.util.ArrayList; 
import java.util.LinkedList; 

class ListExa{ 
public static void main(String[] args){ 
    ArrayList<int> names = new ArrayList<int>(); 
    names.add(1); 
    names.add(2); 
    names.add(3); 
    names.add(4); 
    names.add(5); 

    System.out.println(names); 

} 
} 

あなたがプリミティブ型 intの代わりにクラス Integerを使用する必要があります
-1

収集サポートは、我々はそれが

このような
List<Integer> names = new ArrayList<Integer>(); 
+0

彼の最初の行はそれ自体が間違っていたので、私はそれを修正しました。明らかに、文字列を追加していなければならないので、リスト names = new ArrayList (); – user2862544

1

でなければなりませんので、必ずスーパーの参照を与える意味

ArrayList<Integer> names = new ArrayList<Integer>();次のように書くべきではありませんベストプラクティスとして、代わりにint型

の整数を使用し、唯一のオブジェクトプリミティブ型ではなく、Integerのラッパークラスを使用する必要があります。

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

Foもっと詳しくはこちらをご覧ください: Why don't Java Generics support primitive types?

関連する問題