如何在java中删除未经检查的强制转换警告?

时间:2010-01-16 09:59:55

标签: java casting warnings unchecked

我有这段代码:

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(地址)”的部分给我一个警告:“类型安全:未经检查从远程投射到T

我不想使用“ @SuppressWarnings(”unchecked“)”,我只是想知道为什么当“ T扩展远程时它会显示警告“并修复它(为了清洁代码)

Thnaks。

3 个答案:

答案 0 :(得分:7)

这里的“未经检查的强制转换”意味着Java无法在运行时验证要转换的对象是否实际上是T类型,因为在运行时不知道类型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

答案 1 :(得分:2)

由于Naming.lookup()返回一个Remote,因此你的演员实际上是未选中的。

如果你有T类的句柄,你可以使用:

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

将返回T.由于擦除,您需要在构造函数中提供类,或使用其他一些hackery,例如:MoreTypes.java

答案 2 :(得分:1)

有一些警告与类型转换泛型相关,我从来没有能够消除。我放弃并使用了@SuppressWarnings

另一种选择,取决于IDE,是使编译器对问题不那么敏感。 Eclipse允许我有选择地关闭特定警告。我发现Swing GUI类(以及其他类)中的“缺少串行UID”警告非常烦人,并且将它们停用。如果我对这些类型演员警告感到太恼火,他们将遭受同样的命运。