型チェックと型キャストを理解しようとしています。ジェネリックを使用したコレクションの型キャストの概念を理解しましたが、ジェネリックはどこでコレクション以外の不正な型キャストの強力な型チェックを許可しますか? コンパイル時に型キャスト エラーが発生し、Generics がこれを効果的に処理する例を教えてください。
前もって感謝します
たとえば、次の場合を考えてみましょう。
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
後で問題を引き起こす可能性があるステップでスローされるコンパイル時エラーはありません。
JPA は s でジェネリックを使用TypedQuery
して、期待される型が確実に返されるようにします。を要求するCustomer
と、型システムは、クエリの結果を自分でキャストする必要Customer
のあるプレーンとしてではなく、オブジェクトとして扱うことを認識します。Criteria API を使用すると、クエリ パラメータが有効な属性を参照していることも確認できます。クラスのObject
。Customer
非常に基本的な例は、オブジェクトを構築するための抽象クラスです。
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)
そのため、コンパイラは、入力と出力が正しい型であることをチェックする際にほとんどまたはまったく助けを提供せず、実行時に安全ではない可能性のある型キャストを実行することを強制します。
(免責事項: これは、共分散などのために少し単純化しすぎています。)
コレクション以外の例の 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) {
// ...
}
}