2016-12-02 17 views
2

と言いましょう。Importableというインターフェイスが複数実装されていて、そのうちの1つがImportableImplです。リスト<ステージング<Importable>>リストに<ステージングする<インポート可能なImpl >>をjavaの8ストリーム

私はクラスStagingのリストを持っていますが、そのタイプはImportableです。

javaの8ストリームを介して、私はリスト変換したい:リストに

List<Staging<Importable>> list1 

を:

List<Staging<ImportableImpl>> list2 

私はすでにリストlist1Staging<ImportableImpl>のリストであることを確信しているので、 ClassCastExceptionが発生する可能性があります。 javaがこの種の変換をジェネリック型で許可するかどうかはわかりません。

私はこのような何か試してみたかった:

list1.stream() 
    .map(Staging::getImportable) // retrieve generic type 
    .map(ImportableImpl.class::cast) 
    .collect(Collectors.toList()) 

をしかし、これで私はList<ImportableImpl>なくList<Staging<ImportableImpl>>を取得します。

+0

どのようにして 'Staging'オブジェクトを作成しますか? – BretC

+0

なぜこれを行う必要がありますか?インターフェイスにメソッドを追加する必要があるかもしれません。 – flakes

答えて

4

私は本当にあなたの試みの何の目的に気づいていませんが、あなたは関係なく、最初のリストにあるもののList<Staging<ImportableImpl>>List<Staging<Importable>>をオンにすることはできません。これらのタイプは不可分です。

(ただし、警告で)それを行うための唯一の合理的な方法は次のとおりです。

listList<Staging<? extends Importable>>の種類、ない List<Staging<Importable>>を持って
@SuppressWarnings("unchecked") // if you are sure that all elements are ImportableImpl 
list.stream().map(i -> (Staging<ImportableImpl>) i).collect(Collectors.toList()); 

。もちろん


、それはメソッド参照して書くことができます。

list.stream().map(Staging.class::<ImportableImpl>cast).collect(Collectors.toList()); 
0

これは、この答えは、あなたがnew Staging<>(thing)を使用してStagingオブジェクトを作成することができると仮定し

...あなたは新しいステージングオブジェクトを作成するために持っているように私には見えます。これはあなたが必要とするものですか?

list1.stream() 
    .map(s -> new Staging<ImportableImpl>(s.getImportable())) 
    .collect(Collectors.toList()) 
+0

これは私が選んだ解決策ですが、新しいオブジェクトを作成せずにそれを行う方法があるかどうかを知りたかったのです。ステージングの他のすべてのフィールドは、このソリューションでもう一度設定する必要があります。 –

+0

@louisamorosステージングオブジェクトに 'ImportableImpl'sが含まれていることが確実であれば、' .map(s - >(ステージング)((ステージング)s)))) ' – BretC

+0

@ louisamoros私は他のコメントのいくつかに同意します、これはやるべき厄介なことです – BretC

0

私はあなたが基本的に自分のlist1が実際にすでにタイプList<Staging<ImportableImpl>>の一覧であることを表現したいよりも、この権利を得た場合。したがって、インタフェースImportableによって提供される抽象化を取り除く。

実行時には、汎用タイプが存在しないため、ちょうどList<Staging<ImportableImpl>> list2 = (List) list1をキャストする必要があります。これはチェックされていないキャスト(中間形式の生の形式を使用)であり、タイプシステムが提供する安全性の一部を削除します。誰かがタイプStaging<AnotherImportableImpl>のオブジェクトをlist1に追加した場合、破損する可能性があります。 ストリームのような空想的な構文を使用しても状況は変わりません。基本的には、チェックできないことが分かっていることをコンパイラに伝えたいだけです。

関連する問題