狡猾的Java演员阵容



在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;
}

因此,这将不是类型安全的,强制类型转换有效地不起任何作用。你可以在这里阅读更多关于类型擦除的信息。

相关内容

  • 没有找到相关文章

最新更新