3

私はこのコードを持っています:

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;

public class ClientLookup<T extends Remote> {
 private T sharedObject;

 public void lookup(String adress) throws MalformedURLException, RemoteException, NotBoundException {
   sharedObject = (T) Naming.lookup(adress);
 }

 public T getSharedObject() {
   return sharedObject;
 }
}

(T)Naming.lookup(adress)」の部分は、警告を表示しています:「タイプセーフティ:リモートからTへのチェックされていないキャスト

「 @SuppressWarnings( "unchecked") 」を使用したくないのですが、「 T extends Remote 」のときに警告が表示される理由を知り、修正します(クリーンなコードの場合)。

Thnaks。

4

3 に答える 3

7

ここでの「チェックされていないキャスト」とは、実行時に型が不明Tであるため、キャストされるオブジェクトが実際に実行時に型であるかどうかをJavaが検証できないことを意味Tします。せいぜい、それが実際にタイプであることを確認できRemoteます。

この問題の一般的な回避策はClass<T>、タイプを定義するオブジェクトを提供することです。

public class ClientLookup<T extends Remote> {
  private T sharedObject;
  private Class<T> clazz;

  public ClientLookup(Class<T> clazz) {
    this.clazz = clazz;
  }

  public void lookup(String adress) throws MalformedURLException, RemoteException, NotBoundException {
    sharedObject = clazz.cast(Naming.lookup(adress));
  }

  public T getSharedObject() {
    return sharedObject;
  }
}

このようにして、型をT明示的にし、実行時に認識させます。

于 2010-01-16T10:06:32.270 に答える
2

型キャストジェネリックに関連するいくつかの警告がありますが、これを排除することはできませんでした。私はあきらめて使用し@SuppressWarningsました。

IDEに応じた別の代替方法は、コンパイラーの問題に対する感度を低くすることです。Eclipseでは、特定の警告を選択的にオフにすることができます。Swing GUIクラス(とりわけ)の「シリアルUIDがありません」という警告は非常に煩わしく不要であり、非アクティブ化されています。これらの型キャストの警告にイライラしすぎると、同じ運命をたどります。

于 2010-01-16T10:05:34.687 に答える
2

Naming.lookup()はRemoteを返すため、キャストは実際にはチェックされていません。

Tのクラスへのハンドルがある場合は、次を使用できます。

private Class<T> clazz;
clazz.cast(Naming.lookup(address)); 

これはTを返します。消去のため、コンストラクターでクラスを指定するか、 MoreTypes.javaなどの他のハッカーを使用する必要があります。

于 2010-01-16T10:06:39.600 に答える