作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经实现了这个功能:
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/
我已经实现了这个功能: static Y castOrNull(X obj) { try { return (Y)obj; } catch(ClassCastException
我是一名优秀的程序员,十分优秀!