2

コードを生成して多少近代化しようとしているいくつかのクラスを調べているところですが、根本的に間違っていると思われるクラスで非常に一般的に使用されているライブラリメソッドがあることに気付きましたが、私は感じません私はそれが実際に間違っているかどうかを十分に説明する知識を持っています.

データベーステーブルから取得してリストボックスに表示するデータには、ZK と呼ばれる Java Web UI フレームワークの ListModel を使用しています。

ListModelList lm = (ListModelList) lbox.getListModel();
lm.add(item);

「getListModel()」のライブラリ メソッド宣言は次のとおりです。

public <T> ListModel<T> getListModel()

ここで見つけることができます: http://www.zkoss.org/javadoc/latest/zk/org/zkoss/zul/Listbox.html#getListModel()

今私がこれを行うとき:

ListModelList<Material> lm = new ListModelList<Material>(itemList);
lbox.setModel(lm);

ListModelList model = (ListModelList) lbox.getListModel(); // returned type is ListModel<Object> and generates a compiler warning

型の消去による ListModel からのキャストにより、コンパイラの警告が生成されます。

しかし、私がこれを行うと:

ListModelList<Material> lm = new ListModelList<Material>(itemList);
lbox.setModel(lm);

ListModelList<Material> model = lbox.getListModel(); // compiler error.

これは API の欠陥であり、ジェネリックを使用するために正しいジェネリック型 (知っていれば) への安全でないキャストを行う必要があると考えるのは間違っていますか? または、一見不必要なキャストを毎回防ぐより良い方法はありますか?

4

1 に答える 1

4

getListModel()ListModel<T>ではなく a を返しますListModelList<T>ListModelList<Material>したがって、に置き換えることができますListModel<Material>。または、 のメソッドが必要でListModelList、これが返されるオブジェクトの型であることが確実な場合は、明示的なキャストを行う必要があります。

ListModel<Material> model = lbox.getListModel(); 

また

ListModelList<Material> model = (ListModelList<Material>)lbox.getListModel(); 
于 2013-05-01T14:01:24.250 に答える