Java:从 X 到 Y 的未经检查的转换/如何实现castOrNull
我已经实现了这个函数:
static <X,Y> Y castOrNull(X obj) {
try {
return (Y)obj;
}
catch(ClassCastException e) {
return null;
}
}
这给了我编译器警告:
Type safety: Unchecked cast from X to Y
我不太明白。我在这里执行的 try/catch
不是对其进行检查吗?我可以忽略该警告吗?
我的功能会按预期工作吗?我该如何正确实施呢?
我还尝试使用 obj instanceof Y 检查,但由于 Java 处理泛型的方式而不起作用。
顺便说一句,这个函数对我来说似乎非常有用(使其他一些代码更干净)。我想知道Java中是否已经存在这样的功能?
我想使用它的一个例子:
void removeEmptyRawStrings() {
for(Iterator<Entity> e = entities.iterator(); e.hasNext();) {
RawString s = castOrNull(e.next());
if(s != null && s.content.isEmpty()) e.remove();
}
}
我的代码中经常遇到这样的情况。我认为这比其他任何东西都更具可读性和简单性。但是,如果您有任何关于如何使该代码更加简单的建议,请给我更好的建议。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
所以这里的问题是,通用参数
Y
在用于动态转换时被视为Object
。它永远不会抛出 CCE。您会在调用方法中抛出 CCE,因为您破坏了静态类型安全性。另外,
X
在这里完全没有意义:几乎可以肯定,正确的解决方案不是尝试这样的事情。
null
不好。选角很糟糕。不过,如果你执意要写废话,你可以传递
Class
对象:So the problem here is that the generic parameter
Y
when used for dynamic casting is treated asObject
. It will never throw a CCE. You get a CCE thrown in the calling method, as you have broken static type safety.Also
X
is entirely pointless here:Almost certainly the correct solution is not to attempt anything like this.
null
is bad. Casting is bad.However, if you are determined to write nonsense, you can pass the
Class
object:我不完全确定它会按预期工作。 (当然取决于您的期望:-)但是此代码将例如导致
java.lang.ClassCastException
(ideone):@Tom Hawtin 得到 “正确”的解决方案。
I'm not entirely sure it will work as expected. (Depends on what you expect of course :-) but this code will for instance result in a
java.lang.ClassCastException
(ideone):@Tom Hawtin got the "correct" solution.
由于java泛型的设计方式,这段代码根本无法工作。泛型仅对编译时类型检查有用,因为类在运行时不使用泛型类型信息。
您的代码将被编译为:
转换为 Object 永远不会失败,并且编译后的代码无法访问编译时存在的泛型类型。由于转换没有按应有的方式发生,因此您会收到未经检查的操作的警告。
Thanks to the way java generics where designed this code wont work at all. Generics are only useful for compile time type checking as the classes don't use generic type information at runtime.
Your code will be compiled to this:
The cast to Object will never fail, and the compiled code has no access to the generic types present at compile time. Since the cast does not happen the way it should you receive a warning for an unchecked operation.
如果您确定这不是问题,则可以通过使用
@SuppressWarnings("unchecked") 注释来抑制此方法中的警告
You can suppress the warning in this method if you know for sure that it's not a problem by annotating it with
@SuppressWarnings("unchecked")