0

型チェックと型キャストを理解しようとしています。ジェネリックを使用したコレクションの型キャストの概念を理解しましたが、ジェネリックはどこでコレクション以外の不正な型キャストの強力な型チェックを許可しますか? コンパイル時に型キャスト エラーが発生し、Generics がこれを効果的に処理する例を教えてください。

前もって感謝します

4

4 に答える 4

2

たとえば、次の場合を考えてみましょう。

public class Test {
    public static void main(String[] args) {
        Pair<Integer, Integer> p1 = new Pair<Integer, Integer>(3, 5);
        Pair<String, Integer> p2 = (Pair<String, Integer>) p1;

        Pair p = new Pair<Integer, Integer>(3, 5);
        Pair<String, Integer> p3 = (Pair<String, Integer>) p;
    }

    static class Pair<A, B> {
        A first;
        B second;

        public Pair(A a, B b) {
            first = a;
            second = b;
        }
    }
}

ジェネリックのPair<String, Integer> p2 = (Pair<String, Integer>) p1ため、コンパイル エラーが発生します。

ただし、pジェネリックを使用しないため、p3 = (Pair<String, Integer>) p後で問題を引き起こす可能性があるステップでスローされるコンパイル時エラーはありません。

于 2013-09-13T08:38:58.877 に答える
0

JPA は s でジェネリックを使用TypedQueryして、期待される型が確実に返されるようにします。を要求するCustomerと、型システムは、クエリの結果を自分でキャストする必要Customerのあるプレーンとしてではなく、オブジェクトとして扱うことを認識します。Criteria API を使用すると、クエリ パラメータが有効な属性を参照していることも確認できます。クラスのObjectCustomer

于 2013-09-13T08:34:41.987 に答える
0

非常に基本的な例は、オブジェクトを構築するための抽象クラスです。

public abstract class BuilderBase<T, P> {
    public T build(P parameter);
}

実装は次のようなものになる可能性があります

public class IntBuilder extends BuilderBase<Integer, String> {
    public Integer build(String parameter) {
        return Integer.parse(parameter);
    }
}

ジェネリックがなければ、build署名は

public Object build(Object parameter)

そのため、コンパイラは、入力と出力が正しい型であることをチェックする際にほとんどまたはまったく助けを提供せず、実行時に安全ではない可能性のある型キャストを実行することを強制します。

(免責事項: これは、共分散などのために少し単純化しすぎています。)

于 2013-09-13T08:39:09.663 に答える
0

コレクション以外の例の 1 つは、クラスがgenericインターフェイスを実装する場合です。たとえば、次のようにComparable<T>実装されIntegerています

Integer implements Comparable<Integer>

インスタンスのみIntegerを と比較できるようにしますInteger

ジェネリック compareTo()メソッドは、インターフェイスで次のように定義されます。

public interface Comparable<T> {    
    public int compareTo(T o);
}

Integerクラスはそれを次のように実装します

public class Integer implements Comparable<Integer> {
    // ...
    public int compareTo(Integer anotherInteger) {
        // ...
    }
}    
于 2013-09-13T08:35:20.063 に答える