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 ”时显示警告并修复它(对于干净的代码)

谢谢。

4

3 回答 3

7

这里的“未经检查的强制转换”意味着 Java 无法验证要强制转换的对象是否在运行时实际上是类型T,因为在运行时类型T是未知的。最多它可以验证它实际上是 type 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。由于擦除,您需要在构造函数中提供该类,或者使用其他一些hackery,例如:MoreTypes.java

于 2010-01-16T10:06:39.600 回答