微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我不太明白.我在这里做的尝试/捕获不是检查吗?我可以忽略这个警告吗?

我的功能是否会按预期工作?我该如何正确实现它?

我也尝试使用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;
    }
}

原文地址:https://www.jb51.cc/java/127288.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐