类类型的变量参数 - Java

时间:2018-03-22 00:29:40

标签: java generics

以下面的方法为例。

<T extends MyInterface> void myFunction(Class<T>... types) {
    // Do some stuff that requires T to implement MyInterface
}

现在,假设MyClass1MyClass2假设MyInterface,则给定下面的方法调用。

myFunction(MyClass1.class, MyClass2.class)

我收到以下错误。

  

不相容的等式约束:MyClass1和MyClass2

如何使这项工作?更具体地说,如何使用在Java中实现接口的类类型的可变参数?

3 个答案:

答案 0 :(得分:3)

拥有T表示T有一个固定值,这意味着所有Class<T>...参数必须是完全相同的类型。编译器无法推断T==MyInferface,因为Class<MyClass1>不是Class<MyInterface>的子类。

您希望允许每个参数具有不同的类型。这需要不同的签名:

void myFunction(Class<? extends MyInterface>... types)

根本不需要T

答案 1 :(得分:3)

您已声明T的上限为MyInterface。通过传递MyClass1.classMyClass2.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>

这就是你收到错误的原因。

相关问题