偷偷摸摸的Java演员

时间:2013-08-11 21:11:06

标签: java android compiler-construction casting aide-ide

在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上进行编译。我认为它甚至可能无法在其他系统上编译。

我的问题是这对所有编译器都有效吗?是不好的代码?如果是,那么为什么呢?

由于

1 个答案:

答案 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的更多信息。