2014-09-24 77 views
2

我是新来的泛型,我有一个问题。如何执行选中的演员?

考虑下面的代码:

public class A {} 
public class B extends A {} 

public <T extends A> T getB() 
{ 
    A test = new B(); 
    Class<B> clazz = B.class; 
    if (clazz.isInstance(test)) 
    { 
     return (T)test; 
    } 
    return null; 
} 

这产生一个未经检查的投警告。在return (T)test;行。 但很明显,我正在检查if (clazz.isInstance(test))行的类型。

有没有办法做一个“检查演员”?

我不是只想压制警告,但实际上实现了检查的演员。不幸的是,我无法找到关于如何执行选中演员的信息。

回答

7

有没有办法做一个“检查演员”?

当然,但值得注意的是,它并没有真正帮助你在这里,因为你的方法是很重要的硬编码在少数地方使用B。您可以执行转换:

clazz.cast(test) 

...但是,这将转换为B,不T。特别是,假设我跑了:

public class C extends A {} 

... 

C c = foo.<C>getB(); 

你会如何期待这种工作?

您可能要更改您的代码是这样的:

public <T extends A> T getB(Class<T> clazz) 
{ 
    A test = // get A from somewhere 
    return clazz.isInstance(test) ? clazz.cast(test) : null; 
} 

那么这很好,因为clazz.cast返回T类型的值,你没事返回。

+0

完美!我的实际代码已经传入了一个Class参数。奇怪我错过了“演员”功能。谢谢! – AllenKll 2014-09-24 18:31:38