Alb*_*ert 6 java casting instanceof classcastexception
我已经实现了这个功能:
static <X,Y> Y castOrNull(X obj) {
try {
return (Y)obj;
}
catch(ClassCastException e) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我编译器警告:
Type safety: Unchecked cast from X to Y
Run Code Online (Sandbox Code Playgroud)
我不太明白.这不是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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的代码中经常出现类似这样的情况.我认为这比其他任何东西都更具可读性和简单性.但是,如果你有任何关于如何使代码更简单的话,请给我一个更好的建议.
Tom*_*ine 11
所以这里的问题是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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3918 次 |
| 最近记录: |