在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编译器进行编译。我想它甚至可能不会在其他系统上编译。
我的问题是,这适用于所有编译器吗?这是坏代码吗?如果是,为什么?
感谢
我认为这很糟糕,因为类型擦除,你得到编译器警告(你抑制了它)不是偶然的。
您的方法
public static final <U1, U2> U1 cast(U2 inst) {
return (U1)inst;
}
在类型擦除后看起来有点像这样:
public static final Object cast(Object inst) {
return (Object)inst;
}
因此,这将不是类型安全的,强制类型转换有效地不起任何作用。你可以在这里阅读更多关于类型擦除的信息。