我正在使用包含我想使用的方法的库。简化的签名如下所示:
final class ThirdPartyClass
{
public static <T> void thirdPartyMethod(Class<T> clazz, T instance)
{
// does something
}
}
在thirdPartyMethod()
内部,它需要T
的class作为第一个参数,并需要特定类T
的instance作为第二个参数。
现在我有了一个简单的抽象类,它调用这个方法:
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()
的预期参数?如果可能,请提供说明。
1条答案
按热度按时间t98cgbkg1#
根据
Object.getClass()
的返回类型实际的结果类型是
Class<? extends |X|>
,其中|X|
是对其调用getClass的表达式的静态类型的擦除。由于
T
扩展了Number
,因此得到的类型将是Class<? extends Number>
,即意味着扩展Number
的 * 未知类型 *,其不匹配T extends Number
(即扩展Number
的 * 特定 * 类型,其将在运行时提供)。如何修改Parent类,使其符合thirdPartyMethod()的预期参数?
**1.**在构造函数中引入第二个
Class<T>
类型的参数。**2.**进行铸造(如评论中所述):
顺便说一句,与其从构造函数调用方法(特别是那些不是由您/您的同事开发和测试的方法),您可能会考虑引入一个工厂方法,该方法将基于方法调用的结果生成您的域对象。