2016-01-15 8 views
5

とても一般的な質問のタイトルについては申し訳ありませんが、質問を正しく呼び出す方法がわかりませんでした。ワイルドカードと静的ラッパーを使用したJavaジェネリック

Collections.singleton呼び出しの結果のデフォルトのタイプを参照してください:私は説明できない何か

Set<Number> numberSingleton = 
    Collections.singleton((Number) null); 

Set<Collection> rawCollectionSingleton = 
    Collections.singleton((Collection) null); 

Set<Collection<String>> stringCollectionSingleton = 
    Collections.singleton((Collection<String>) null); 

Set<? extends Collection<?>> anyCollectionSingleton = 
    Collections.singleton((Collection<?>) null); 

は最後の行です。単純な代わりに? extends Collection<?>が使用される理由Collection<?>

これは正しい解決方法ですか?

Set<Collection<?>> anyCollectionSingleton = 
    Collections.<Collection<?>>singleton((Collection<?>) null); 

私はこのすべて始めた理由:

私はラインをコンパイルしていないとの問題があった:

java.util.Optional.ofNullable((Collection<?>) a).orElse((Collection<?>) b); 

をこの問題を解決するようだが、価格は何ですか?

java.util.Optional.<Collection<?>>ofNullable((Collection<?>) a).orElse((Collection<?>) b); 
+0

あなたの質問は、IDEがその奇妙なタイプを生成する理由です。 Set >シングルトン= Collections.singleton((Collection ));うまく動作します – AdamSkywalker

+0

Oracle JDK 1.8.0_40は私にコンパイルエラーを返します:: java:互換性のない型:java.util.Set をjava.util.Set > '。どのJavaバージョンを使用していますか? – Gedrox

+0

最新、1.8.0_66 – AdamSkywalker

答えて

0

いいえ、全く異なる概念です。

Set<? extends Collection<?>> anyCollectionSingleton = 
Collections.singleton((Collection<?>) null); 

で使用されることを意図して何

あなたは、一般的なクラスのコレクションを拡張する一般的なクラスを持っているということです。

だから、継承についてです。

+0

しかし、 'Collection 'の大文字と小文字は同じですか? – Gedrox

+0

'String'は独立したクラスのようなもので、' Object'クラスから直接継承しますが、例えば 'Integer'クラスは' Number'を継承します。あなたの場合はこれで十分ですか?あなたが何か他のことを意味していたなら、例が役に立つかもしれません。 – thodorisbais

+0

私はなぜ 'Collection 'が 'Set >'を生成し、 'Set <? extends Collection > 'コレクション'のように? – Gedrox

関連する問題