我是Generics的新手并且遇到了问题。
请考虑以下代码:
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))
行检查类型。
有没有办法进行“格式化演员表”?
我不打算只是压制警告,但实际上是实施了一次检查。不幸的是,我无法找到有关如何执行检查演员表的信息。
答案 0 :(得分:11)
有没有办法进行“格式化演员表”?
当然,虽然重要的是要注意它不会真正帮助您,因为您的方法在某些地方使用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
类型的值,您可以返回。