2009-08-31 7 views
4

リストに私のファイルを入れた後、保存するときに、私はJava Listがパラメータ化されていますか?

など、私は、int型、基本的には文字列のような他のオブジェクトのコンテナですDLPFile というクラスを書い浮かぶ ... Javaのに非常に新しいですそれは私のセッション(Mapクラスからのものです)の変数は簡単です。

DLPFile file = new DLPFile(); 
List <DLPFile >fileList = new ArrayList <DLPFile>(); 
fileList.add(file); 
session.put("filesList", fileList); 

ただし、セッションvarからリストを取得するにはどうすればよいですか? 私は:

List <DLPFile files = (List) session.get("fileslist"); 

は、私はいくつかの警告を得た:

"List is a raw type.References to generic type List<E> should be parameterized." 

私は

List <DLPFile files = (List <DLPFile>) session.get("fileslist"); 
List <DLPFile files = (List) session.get("fileslist")<DLPFile>; and 
List <DLPFile files = (List) <DLPFile> session.get("fileslist"); 

を試みたが、どれも私は、これは "鋳造" の一種であると仮定し

を働きません問題...(たぶん?)

ありがとうございます;)

答えて

3

これは、ジェネリック型消去です。コンパイラは、実際のジェネリック型の引数をセッションから取得したときにそれを判断する方法はありません(session.getがクラス<T>の引数を取る場合を除きます)。オブジェクトがListのインスタンスであることを確認できますが、ジェネリック型の情報は失われます(基本的に、コンパイラはリスト<オブジェクト>を内部的にリストに変換します)。プログラマーとしてのあなただけが、それをキャストするジェネリック型のパラメータが正しいかどうかを知ることができるので、あなたは警告を受け取ります。

あなたはあなたの方法の先頭に

@SuppressWarnings("unchecked") 

注釈を追加することができ、警告を好きではない場合。

+0

ありがとうございます...しかし、私はそれを抑える代わりに警告を解決する方法はありますか? – nacho4d

+0

あなたは 'リスト'を持つことができますが、あなたのファイルタイプのリストが必要なので、いいえ – pjp

+0

いいえジェネリックスがJavaでどのように実装されているかの理由で方法がありません。唯一の方法は、セッションオブジェクトがgetメソッドの汎用パラメータをサポートすることです(ただし、チェックされていないキャストとは何もしません)。それは単なる警告であり、誤りではありません。リストはリストと同等です。最良の方法はリストから独自のクラスを派生させることです。その場合、ジェネリックインターフェイスではなく実際のクラスをチェックします。 – Daff

2

あなたは>を最初に見つけられませんでしたか?すなわち、 'List < DLPFileファイル'は、 '<DLPFile>'ファイル 'リストである必要があります。あなたは私はあなたのセッションがMap<String, List<DLPFile>>ことを期待していないので、未チェックのキャストの警告を取得しますが、

+0

私は文字がここに表示されていないと思う...とにかく、それは警告の起源ではありません。 – nacho4d

+0

DLPFileのリストではない他のオブジェクトを保存するためにセッションオブジェクトも使用しています。これが、提案したとおりマッピングしない理由です。 ところで:Stackoverflowは非常に便利です! – nacho4d

1

あなたがしようとした最初のオプションは、あなたが必要とするものです:あなたが得る最初の警告は、ジェネリック医薬品とは何の関係もありません

List<DLPFile> files = (List<DLPFile>) session.get("fileslist"); 

:にキャストするときには警告を得るでしょう、例えば、String同じように。コンパイラは返されたオブジェクトがList<DLPFile>であることを保証できないことを伝えます。

2番目のタイプは、生のタイプについて、ジェネリックスと関係があります。上記のオプションを使用した場合、取得する必要はありませんが、ちょうどListにキャストすると取得できます。あなたのケースでは、タイプパラメータなしでListを使用しないでください。<DLPFile>

+0

私はあなたに同意します。しかし、なぜ警告が提案されたコードで消えないのか分かりません。 (私が試したのは初めてです) – nacho4d

+0

このオプションの警告は他のものと同じですか?それにはパラメータ化されていない参照がないので... – Jorn

+0

@ nacho4d - ジェネリックの仕組みのため警告が消えません。基本的にコンパイル時のトリックです。 'List 'へのキャストは、リストが実際に 'List 'であることをチェックするコンパイラ*か*ランタイムのための方法がないので、基本的には 'List'にキャストするのとまったく同じですが、 'List 'と言ってください。あなたのキャストがこの行のClassCastExceptionsから実際にあなたを保護しているわけではないことをあなたに知らせるだけです。 –

0

他にもあるように、Javaではジェネリック型を安全にキャストできません。

コンパイラを無視するのではなく、この問題を解決するより良い方法は、セッションに何か意味のあるものを入れることです。この種のコレクションの種類を処理するクラスにListをラップします。ちょっと、getFilesメソッドではなく、リストで意味のあるいくつかのインスタンスメソッドを追加してください。

関連する問題