如何在 Java 中使用泛型类型参数内的附加边界进行强制转换

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

是否可以转换一个对象来适应既是泛型类型参数又具有多个边界的参数?

我的情况是这样的:

public <T extends TypeA & TypeB> void problematic(Class<T> class)
{
    doSomething();
}

public void myMethod(Object obj)
{
    if (obj instanceof TypeA && obj instanceof TypeB)
    {
        problematic(obj.getClass())
    }
}

如果我有一个实现这两个接口的特定类,有问题的方法就可以正常工作。 问题是这一次,我只有一个对象可以使用,并且必须对其进行强制转换以满足编译器的要求。

有问题的方法已经被经常使用,我不想改变它。

我已经尝试过以下演员:

problematic(obj.getClass())
problematic((Class<TypeA & TypeB>) obj.getClass())
problematic((Class<? extends TypeA & TypeB>) obj.getClass())
problematic((Class<?>) obj.getClass())
problematic((Class<(TypeA & TypeB)>) obj.getClass())
problematic((Class<TypeC>) obj.getClass())

TypeC 实现了 TypeA 和 TypeB,但该对象并未实际实现 TypeC,因此编译时它只是在运行时失败

java generics casting polymorphism multiple-bounds
1个回答
0
投票

原始类型

经过大量的试验和错误,我找到了使用原始类型的解决方案:

problematic((Class) obj.getClass())

这将给出 rawtypes 警告,但它有效,并且由于事先检查了强制转换,因此向强制转换添加 @SuppressWarnings("rawtypes") 没有真正的问题。

不过,这看起来更像是一种解决方法,我想知道为什么声明像 Class 这样的东西不是一个选项。

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