Java:未选中从X转换为Y /如何实现castOrNull
发布时间:2020-12-14 23:49:55 所属栏目:Java 来源:网络整理
导读:我已经实现了这个功能: static X,Y Y castOrNull(X obj) { try { return (Y)obj; } catch(ClassCastException e) { return null; } } 这给了我编译器警告: Type safety: Unchecked cast from X to Y 我不太明白.我在这里做的尝试/捕获不是检查吗?我可以忽
我已经实现了这个功能:
static <X,Y> Y castOrNull(X obj) { try { return (Y)obj; } catch(ClassCastException e) { return null; } } 这给了我编译器警告: Type safety: Unchecked cast from X to Y 我不太明白.我在这里做的尝试/捕获不是检查吗?我可以忽略这个警告吗? 我的功能是否会按预期工作?我该如何正确实现它? 我也尝试使用y检查的obj实例,但由于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(); } } 我的代码中经常出现类似这样的情况.我认为这比其他任何东西都更具可读性和简单性.但是,如果你有任何关于如何使代码更简单的话,请给我一个更好的建议. 解决方法
所以这里的问题是用于动态转换时的泛型参数Y被视为Object.它永远不会抛出CCE.您在调用方法中抛出了一个CCE,因为您已经破坏了静态类型安全性.
X在这里完全没有意义: 几乎可以肯定,正确的解决办法不是尝试这样的事情. null很糟糕.施法很糟糕. 但是,如果您决定编写废话,则可以传递Class对象: public static <T> T evilMethod(Class<T> clazz,Object obj) { try { return clazz.cast(obj); } catch (ClassCastException exc) { return null; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |