0

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

我的问题是这适用于所有编译器吗?是坏代码吗?而且,如果是,那为什么?

谢谢

4

1 回答 1

1

我认为这很糟糕,因为类型擦除,你得到编译器警告(你压制)并不是偶然的。

你的方法

public static final <U1, U2> U1 cast(U2 inst) {
    return (U1)inst;
}

类型擦除后看起来有点像这样:

public static final Object cast(Object inst) {
    return (Object)inst;
}

所以这不是类型安全的,强制转换什么都不做。您可以在此处阅读有关类型擦除的更多信息。

于 2013-08-11T21:47:17.817 回答