2017-04-19 8 views
1

は、私は次のようにダブルリストに文字列のリストを変換しようとしている:<?>をList宣言に追加すると、StringリストからDoubleリストに変換するとエラーが発生するのはなぜですか?

List<String> myStringList = Arrays.asList("10.0", "10.5", "5.0"); 
List<?> myDoubleList = new ArrayList(); 
for(String s : myStringList){ 
     myDoubleList.add(Double.parseDouble(s)); 
} 

私はリストの説明から<?>を削除すると、それが動作します。しかし、私はそれを追加するときに壊れます。それは私にこのエラーを与える:

The method add(capture#6-of ?) in the type List is not applicable for the arguments (double)

なぜですか?

+2

参照:http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-pこれは詐欺ではありませんが、問題。 –

+0

Btw:リストのようにリストを宣言しているようです。 – SpiderRico

+0

なぜそれが 'List 'ではありませんか? –

答えて

0

List<?>は、未知のタイプの汎用Listを表しています。このList<?>List<String>,List<Double>,List<File>など、実際にはすべてList<?>とカウントされます。つまり、タイプがList<?>の場合、Doubleを追加することはできません。myListOfWildcardが実際にList<String>の場合は、myListOfWildcard.add(someDouble)が失敗する可能性があります。

ワイルドカード(特にList<?>)は、何かを含めることができるようにするにはあまり役に立ちません。それらを使用する場合は、通常List<Object>を使用します。ワイルドカードは、これらの特殊なケースを自分自身で許可したい場合に、より便利です。メソッドがあり、List<String>またはList<Double>のいずれであっても、任意のタイプのリストを受け入れることができるようにするには、List<?>のいずれかであるため、List<?>が便利です。しかし、リストの実際のジェネリック型パラメータについて何かを引き受ける能力がなくなります。つまり、Doubleを追加するだけではなりません。

List<?>List<? extends Object>のショートカットです。ワイルドカードリストは、メソッドの引数として最も有用です。通常は自分で作成したくありません。具体的にはCollection.containsAllは引数としてCollectionを受け入れます。 Collection<Object>である必要はありませんが、Collection<?>の代わりにそのタイプとして表示されている場合はCollection<Object>となります。

編集:コメントの段落が追加されました。

+0

*メソッドがあり、リストまたはリストのいずれであっても、どのタイプのリストを受け入れることができるようにしたい場合は、これはList が役に立ちます。*なぜ、リストを使用しませんか?じゃあ? –

+0

リストはList <? Object>を拡張します。ワイルドカードは、メソッドの引数として最も有用です。あなたは通常、それを自分で構築したくありません。実際の例として、[Collection.containsAll](https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#containsAll(java.util.Collection))を参照してください。 –

+0

特に、 'Collection.containsAll'は' Collection'を引数として受け入れます。それはあなたがそれを使用した場合には「Collection 」になる*ことはありません。 –

関連する問題