48

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();
 }
 [...]

助けてくれてありがとう

4

6 に答える 6

78

はい-これは型消去の自然な結果です。oが実際にそのインスタンスである場合、キャストによってキャッチされません-文字列の代わりにAction<String>渡すことで、それを使用しようとしたときにのみ問題が発生します。ClientInterface

次を使用して警告を取り除くことができます。

@SuppressWarnings("unchecked")

関数アノテーションとして、しかしあなたは根本的な問題を簡単に整理することはできません:(

于 2010-04-07T13:13:35.017 に答える
16

いつものように、ジョンスキートは正しいです。

彼の答えの簡単ではない部分について詳しく説明するには:

与えられた

class ClientAction implements Action<ClientInterface> {}

あなたは書ける:

Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();

これにより、キャストと警告の両方が排除されますが、非ジェネリック型が導入される.class代わりに、十分に正確に型指定されたClassオブジェクトを取得するために使用できます。

于 2010-04-07T13:35:57.113 に答える
6

警告は、実行時にキャストが正常に機能していても、コンパイラが型の安全性を保証できないことを意味します。消去のため、実行時のキャストは単にアクションへのキャストです。基になるジェネリッククラスが期待どおりにClientInterface型ではない可能性があります。この場合、問題はClassCastExceptionとして後で(おそらくもっと後で)現れます。

この特定のケースでは、次のコンパイラ指令によってこの特定の警告を抑制することをお勧めします。

@SuppressWarnings("unchecked")
于 2010-04-07T13:23:09.960 に答える
2

心配しないでください。これは、Javaコンパイラには、オブジェクトの実際のタイプが何であるかを知る方法がないためです。

于 2010-04-07T13:14:12.127 に答える
1

消去(つまり、パラメーター化された型が消去された)のために型情報が失われたため、警告が表示されます。ジェネリックがより頻繁に使用されるように周囲のコードをクリーンアップする以外に、それについては何もできません。そのため、ジェネリック型情報を渡して、キャストをまったく回避できます。

于 2010-04-07T13:19:58.493 に答える
0

これはダウンキャストです。これは、参照が指している実際のオブジェクトをコンパイラーが認識しない動的キャストです。

この警告が表示されるのは、キャストのターゲットタイプがAction<ClientInterface>パラメーター化されたタイプであり、コンパイラーは、キャストされているオブジェクトが同じタイプであることを保証できないためです。

この警告を抑制せず、typeパラメーターを気にしない場合は、ワイルドカードを使用してコードをこれに変更できます。

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をチェックできないため、これははるかに安全です。実行時にさらにジェネリック型情報が消去されるため、のオブジェクトであるかどうかをチェックするだけです。oAction<ClientInterface>oAction

于 2018-03-26T14:02:20.983 に答える