クラスを考えてみましょう:
class OnlyIntegerTypeAllowed<T> {
OnlyIntegerTypeAllowed(Class<T> clazz) {
System.out.println(clazz);
if (clazz != Integer.class)
throw new RuntimeException();
}
}
の型引数のみを受け入れるように設計されていInteger
ます。if-throw
そのコンストラクターにチェックを追加しました。これは、型引数を確認するための非常に一般的な方法です。
ただし、このチェックは次の方法でバイパス (ハッキング、騙され) できます。
OnlyIntegerTypeAllowed<Integer> normalWay =
new OnlyIntegerTypeAllowed<Integer>(Integer.class);
OnlyIntegerTypeAllowed<String> hacking =
new OnlyIntegerTypeAllowed<String>((Class<String>) Class.forName(Integer.class.getName()));
上記の2行には、コンパイル エラーも例外もスローされていません。
OMG - 型引数を強制するより良い方法はありますか?