2010-01-16 37 views
3

我有这段代码:我如何删除java中的unckecked转换警告?

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

我不wanto使用” @SuppressWarnings(“未登记”)”,我只是想知道为什么它显示了当一个警告‘牛逼扩展远程’并修复它(一个干净的代码)

Thnaks。

回答

1

有一些警告与类型仿制药相关,我从未消除过。我刚放弃并使用@SuppressWarnings

另一种替代方法,取决于IDE,是让编译器对问题不那么敏感。 Eclipse让我有选择地关闭特定的警告。我发现Swing GUI类(除其他之外)中的“丢失的串行UID”警告非常烦人,并且使它们失效。如果我因这些类型的警告而感到烦恼,他们会遭受同样的命运。

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明确并在运行时知道。

+0

+1,提供了一个有效的解决方案。但是,我对这个问题感到震惊,Java让你去做这件事!也许斯卡拉的时间到了。 – 2010-01-16 10:10:25

+0

@Carl - 你走吧...然后不要在出门的时候猛击门:-) – 2010-01-16 10:15:06

2

由于Naming.lookup()返回一个Remote,因此您的转换实际上未被选中。

如果你有一个句柄T级的,你可以使用:

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

这将返回因为擦除的T.你就需要给类构造函数,或使用一些其他的两轮牛车如:MoreTypes.java