在 Java (Android) 中,我有一些代码如下所示:
for (Tuple tuple : xRange) {
Tuple5<Integer, Integer, Double, Double, Double> t = (Tuple5<Integer, Integer, Double, Double, Double>)tuple;
...
}
写起来可能很痛苦。顺便说一句,Tuple5 源自 Tuple。
所以我写了这个方法:
@SuppressWarnings("unchecked")
public static final <U1, U2 extends U1> U2 cast(U1 inst) {
return (U2)inst;
}
看起来很恶心吧?但这让我可以像这样重写代码:
for (Tuple tuple : xRange) {
Tuple5<Integer, Integer, Double, Double, Double> t = cast(tuple);
...
}
我正在使用 AIDE 编译器在 Android 上进行编译。我认为它甚至可能无法在其他系统上编译。
我的问题是这适用于所有编译器吗?这是坏代码吗?如果是的话,为什么?
谢谢
我认为这很糟糕,因为类型擦除,你收到编译器警告(你压制它)并不是偶然的。
你的方法
public static final <U1, U2> U1 cast(U2 inst) {
return (U1)inst;
}
类型擦除后看起来有点像这样:
public static final Object cast(Object inst) {
return (Object)inst;
}
所以这不是类型安全的,该强制转换实际上什么也不做。您可以在此处阅读有关类型擦除的更多信息。