Java:从 X 到 Y 的未经检查的转换/如何实现 castOrNull

标签 java casting instanceof classcastexception

我已经实现了这个功能:

 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();
        }
    }

我的代码中经常遇到这样的情况。而且我认为这比其他任何东西都更具可读性和简单性。但是,如果您有任何关于如何使该代码更简单的建议,请给我一个更好的建议。

最佳答案

所以这里的问题是,用于动态转换的通用参数 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;
    }
}

关于Java:从 X 到 Y 的未经检查的转换/如何实现 castOrNull,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3933609/

相关文章:

JavaScript - File 是 File 的实例,但 `instanceof File` 为 false

java - 将数据写入App Engine项目中的离线数据存储,然后导出

java - 在 Java 小程序中包含 Javac

java - JPA (@OneToMany) 查询不加入子表

python - 将空字符串转换为零

将 char** 转换为 char* - 它会改变它指向的内容吗?

java - 创建未知类的对象

java - 如何保证Java线程运行在不同的内核上

ios - 如何在swift中将标签的文本保存为整数变量?

java - 为什么 "instanceof"不工作?