2011-10-20 10 views
1

どのようにして、ListModelをDefaultListModelにキャストできますか?私はこのTHA気持ちを持ってListModelからJava 7のDefaultListModelへのキャスト

DefaultListModel<E> portalListModel = (DefaultListModel) portalList.getModel(); 

、私は次のことを試してみました

DefaultListModel portalListModel = (DefaultListModel) portalList.getModel(); 

C:\Documents and Settings\...\myfile.java:728: warning: [rawtypes] found raw type: DefaultListModel 
    DefaultListModel portalListModel = (DefaultListModel) portalList.getModel(); 
missing type arguments for generic class DefaultListModel<E> 
where E is a type-variable: 
E extends Object declared in class DefaultListModel 

、私は以下を実行して、私はこのエラーメッセージを取得することは愚かな質問ですが、私は完全にこの新しい汎用でconfuedよもの!私を助けてください!

+0

あなたのリストモデルにはどのような種類のデータ(どのクラス)がありますか? –

+0

正確な型引数がわからない場合は、 '?'を使用できます。 'DefaultListModelを試してみてください。 portalListModel =(DefaultListModel)portalList.getModel();' – Stephan

答えて

5

Javaのコレクションの仕組みは、Collection-typeオブジェクトを使用してオブジェクト全体を格納できるということです。ジェネリックスが導入される前は、コレクション内にオブジェクトを格納しておき、それらのオブジェクトをコレクションから取り出したいときにキャストを実行する必要がありました。

List myList = new ArrayList(); 
myList.add("string"); 
myList.add(new MyValueClass(42, "identifying string")); 

これは完全に受け入れ可能なコードです。あなたがオブジェクトを反復処理したい場合、あなたはそのようにそれを行うことができます。Java 1.5で

Iterator it = myList.iterator(); 
while (it.hasNext()) { 
    String str = (String) it.next(); // NOTE: This will work the first time, but throw a ClassCastException when it gets to the second item. 
} 

を、ジェネリックリストに挿入すると、コンパイル時に型チェックを提供します。ここでmyListList<String>と宣言すると、リストにタイプMyValueClassのオブジェクトを追加しようとすると、上記のコードの最初のブロックがコンパイル時に失敗します。

Java 1.7では、DefaultListModelが総称されています。だから、portalList.getModel()と呼ぶと、特定の種類のオブジェクト(<E>であり、実際のオブジェクトタイプのプレースホルダです)を含むDefaultListModelが返されます。上記List<String>の例では、Stringが代入ですE

あなたportalListオブジェクトのmodelメンバーがMyValueClassオブジェクトの束が含まれているDefaultListModelであれば、その後、あなたの宣言は次のようになります。

DefaultListModel<MyValueClass> portalListModel = portalList.getModel(); 

DefaultListModel API docを参照してください。

+0

誰か説明できますか?注:彼の答えは? –

+1

したがって、私の例(最初のコードブロック)では、2つのオブジェクトを含む 'myList'という基本的な(Java-1.5以前の)' List'オブジェクトがあります。 'myList'の最初のオブジェクトは' String'クラスです。 'myList'の2番目のオブジェクトは' MyValueClass'クラスです。したがって、あなたが 'myList'の値を反復してそれらを取り除くと、イテレータ内のコードは特に' String'オブジェクトを期待しています。ループをはじめて、うまくいくでしょう。しかし、2度目は、 'MyValueClass'オブジェクトをつかみ、それを' String'にキャストしようとし、 'ClassCastException'を投げます。 – Mike

関連する問題