偷偷摸摸的Java演员

问题描述 投票:0回答:1

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

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

谢谢

java android casting aide-ide
1个回答
1
投票

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

你的方法

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.