8

Java でジェネリックを使用していますが、思ったほど良くありません

public static void add(List l, Object o) {
    l.add(o);
}

public static void main(String[] args) throws Exception {
    List<Integer> list = new ArrayList<Integer>();
    add(list, "1.23");
    add(list, 1.23);
    System.out.println(list);
}

これはすべてコンパイルして動作します。例外から値を取得すると、listスローされます。

Java 6でより安全にできますか?

4

2 に答える 2

14

標準を使用することをお勧めしますCollections

List<Integer> checked = Collections.checkedList(list, Integer.class);

次に、作業しcheckedます。非準拠のClassCastExceptionインスタンスの挿入中に がスローされます - 以前よりも早く (つまり、取得中)。

注意: コンパイラ メッセージを確認してください。安全でない/チェックされていないコードについて言及している警告がいくつか出力されているはずです。あなたの問題は、まさにコンパイラが伝えようとしているものです。の署名を制御する場合はadd、ジェネリックにします。これにより、コンパイル時の安全性が確保されます。

public static <T> void add(List<T> list, T t) {
    list.add(t);
}
于 2013-06-08T13:14:26.700 に答える
3

私はそうは思わない。その静的add()メソッドが現実のもの (制御できないもの) である場合、Java ジェネリックは Java < 5.0 と互換性があるように実装されているため、できることはあまりありません。

ただし、メソッドのシグネチャを変更できる場合は、単純に型チェックを適用して、メソッドadd()内のコードのコンパイラ エラーを取得できます。main()

public static <T> void add(List<? super T> list, T object) {
    list.add(object)
}
于 2013-06-08T13:16:42.800 に答える