型の安全性:オブジェクトからの未確認のキャスト
-
25-09-2019 - |
質問
私は私のActionクラスにオブジェクトをキャストしようとするが、それは警告になります:
Type safety: Unchecked cast from Object to Action<ClientInterface>
Action<ClientInterface> action = null;
try {
Object o = c.newInstance();
if (o instanceof Action<?>) {
action = (Action<ClientInterface>) o;
} else {
// TODO 2 Auto-generated catch block
throw new InstantiationException();
}
[...]
任意の助けてくれてありがとう。
解決
はい - これは型消去するの自然な結果です。 o
が実際にキャストによってキャッチされることはありませんAction<String>
のインスタンスである場合 - あなたは、文字列の代わりにClientInterface
に渡し、それを使用しようとすると、唯一の問題が表示されます。
あなたが使用して警告を取り除くことができます:
@SuppressWarnings("unchecked")
機能注釈としてが、あなたは簡単に並べ替えることはできません根本的な問題アウト:(
他のヒント
いつものように、ジョンスキートが正しいます。
彼の答えのない、簡単に部分については詳しく説明します:
タグを考えます
class ClientAction implements Action<ClientInterface> {}
あなたが書くことができます:
Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();
この排除の両方あなたは十分に正確に入力された.class
オブジェクトを取得するためにClass
を使用できるように非ジェネリック型を導入する価格でキャストと警告、ます。
キャストは、実行時に罰金を働く場合でも、コンパイラは型の安全性を保証することはできませんという警告手段。消去のために、実行時にキャストは、単にアクションに鋳造です。予想通り、基礎となる一般的なクラスは型ClientInterfaceではないことも可能です。この場合、問題はClassCastExceptionが発生として、後で(多分かなり後に)表示されます。
この特定のケースでは、私は次のコンパイラディレクティブで、この特定の警告を抑制することをお勧めします
@SuppressWarnings("unchecked")
心配しないでください。これは、Javaコンパイラが知る方法がないので、オブジェクトの実際の型のものである。
あなたは警告したがって、(すなわち、パラメータ化タイプが消去されている)ので、消去の型情報を失ってしまいました。ジェネリック医薬品は、より頻繁に使用されるように、あなたはすべての一般的なタイプの情報と回避鋳造を渡すことができますので、あなたは、周囲のコードをクリーンアップ以外の、それについて何もすることはできません。
これは意気消沈です。これは、コンパイラが参照が指している実際のオブジェクトのないアイデアを持っていない動的なキャストです。
あなたのキャストAction<ClientInterface>
のターゲット・タイプは、をパラメータ化された型のコンパイラであるため、キャスト対象となる型が同じタイプであることを保証この警告をすることはできません取得します。
あなたはこの警告を抑制したくないと型パラメータを気にしない場合は、ワイルドカードを使って、これにコードを変更することができます:
Action<?> action = null;
try {
Object o = c.newInstance();
if (o instanceof Action<?>) {
action = (Action<?>) o;
} else {
// TODO 2 Auto-generated catch block
throw new InstantiationException();
}
[...]
instanceof
はそのo
を確認することができないので、これははるかに安全であるが、Action<ClientInterface>
の目的である、それだけでo
はさらに、一般的なタイプの情報以来Action
の対象であるかどうかを確認することは、実行時の消去されたのだろう。