java 推理变量T与一个方法中的特定类和示例具有不兼容的界限< T>< T>

ccgok5k5  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(199)

我正在使用包含我想使用的方法的库。简化的签名如下所示:

final class ThirdPartyClass
{
    public static <T> void thirdPartyMethod(Class<T> clazz, T instance)
    {
        // does something
    }
}

thirdPartyMethod()内部,它需要Tclass作为第一个参数,并需要特定类Tinstance作为第二个参数。
现在我有了一个简单的抽象类,它调用这个方法:

abstract class Parent<T extends Number>
{
    public Parent(T instance)
    {
        ThirdPartyClass.thirdPartyMethod(instance.getClass(), instance);
    }
}

我得到一个错误:
类ThirdPartyClass中的方法thirdPartyMethod无法应用于给定类型;
必需的:java语言类,T
找到:java.lang.类〈第1个捕获,共?个扩展java.lang.编号〉,T
原因:推理变量T具有不兼容的界限
等式约束:第2个捕获(共?个)扩展了java.lang.Number
下限:T型
如何修改Parent类,使其符合thirdPartyMethod()的预期参数?如果可能,请提供说明。

t98cgbkg

t98cgbkg1#

根据Object.getClass()的返回类型
实际的结果类型是Class<? extends |X|>,其中|X|是对其调用getClass的表达式的静态类型的擦除。
由于T扩展了Number,因此得到的类型将是Class<? extends Number>,即意味着扩展Number的 * 未知类型 *,其不匹配T extends Number(即扩展Number的 * 特定 * 类型,其将在运行时提供)。
如何修改Parent类,使其符合thirdPartyMethod()的预期参数?

**1.**在构造函数中引入第二个Class<T>类型的参数。

abstract class Parent<T extends Number> {
    public Parent(T instance, Class<T> tClass) {
        ThirdPartyClass.thirdPartyMethod(tClass, instance);
    }
}

**2.**进行铸造(如评论中所述):

ThirdPartyClass.thirdPartyMethod((Class<T>) instance.getClass(), instance);

顺便说一句,与其从构造函数调用方法(特别是那些不是由您/您的同事开发和测试的方法),您可能会考虑引入一个工厂方法,该方法将基于方法调用的结果生成您的域对象。

相关问题