我是泛型的新手,遇到了问题。
考虑以下代码:
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))
行检查类型。
有没有办法进行“检查转换”?
我不希望只是抑制警告,而是实际实现检查转换。遗憾的是,我找不到有关如何执行检查转换的信息。
最佳答案
Is there a way to do a "checked cast"?
当然可以,但需要注意的是它真的对您没有帮助,因为您的方法在一些地方被硬编码为使用 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
的值,您可以返回它。
关于java - 如何执行检查类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26022518/