在Java(Android)中,我有一些看起来像这样的代码:
for (Tuple tuple : xRange) {
Tuple5<Integer, Integer, Double, Double, Double> t = (Tuple5<Integer, Integer, Double, Double, Double>)tuple;
...
}
写作可能会很痛苦。顺便说一下,Tuple5来自元组。
所以我写了这个方法:
@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上进行编译。我认为它甚至可能无法在其他系统上编译。
我的问题是这对所有编译器都有效吗?是不好的代码?如果是,那么为什么呢?
由于
答案 0 :(得分:1)
我认为由于类型擦除很糟糕,你得到编译器警告(你压制)并不是偶然的。
你的方法
public static final <U1, U2> U1 cast(U2 inst) {
return (U1)inst;
}
在类型擦除后,看起来有点像这样:
public static final Object cast(Object inst) {
return (Object)inst;
}
所以这不是类型安全的,有效的做法什么都不做。您可以阅读有关类型擦除here的更多信息。