以下面的方法为例。
<T extends MyInterface> void myFunction(Class<T>... types) {
// Do some stuff that requires T to implement MyInterface
}
现在,假设MyClass1
和MyClass2
假设MyInterface
,则给定下面的方法调用。
myFunction(MyClass1.class, MyClass2.class)
我收到以下错误。
不相容的等式约束:MyClass1和MyClass2
如何使这项工作?更具体地说,如何使用在Java中实现接口的类类型的可变参数?
答案 0 :(得分:3)
拥有T
表示T
有一个固定值,这意味着所有Class<T>...
参数必须是完全相同的类型。编译器无法推断T==MyInferface
,因为Class<MyClass1>
不是Class<MyInterface>
的子类。
您希望允许每个参数具有不同的类型。这需要不同的签名:
void myFunction(Class<? extends MyInterface>... types)
根本不需要T
。
答案 1 :(得分:3)
您已声明T
的上限为MyInterface
。通过传递MyClass1.class
和MyClass2.class
,编译器必须推断MyInterface
T
。
但是,参数type
的类型为Class<T>...
,限制了传递给MyInterface.class
的内容并且没有子类型。
取决于&#34;东西&#34;你正在做的事情,你可以在types
的类型上放置一个通配符上限来编译它。
<T extends MyInterface> void myFunction(Class<? extends T>... types) {
答案 2 :(得分:1)
使用第一个参数,类型变量T
设置为MyClass1
MyClass1
应该实现接口,因此满足约束extends MyInterface
。
当然,Class<MyClass2>
不是Class<MyClass1>
。
这就是你收到错误的原因。