0

我有一个界面

interface Inter extends Blah {
   public void someMethod();
}

class Dummy {
  Class<Blah> interfaceType;

  public setInterfaceType( Class<Blah> input ) {
    this.interfaceType = input;
  }  
}

class tester {
  public void init() {
    Dummy dummyObj = new DummyObj();
    dummyObj.setInterfaceType( Inter.class );     //This complains that the type is not suitable
  }
}

编译错误:

Dummy 类型中的方法 setInterfaceType(Class) 不适用于参数 (Class)

我在调用 setter 时尝试强制转换input,但这也是不允许的。Class<Blah>我不明白为什么它不接受一类子类类型。谁能告诉我这里发生了什么以及如何调用 setter。该类Dummy是外部的,所以我无法更改它。

4

2 回答 2

3

泛型不是协变的,因此您不能设置为Class<Blah>object of type Class<Inter>。想想看。如果您能够使用,List<Fruit> list = new ArrayList<Apple>()那么list您不仅可以添加苹果,还可以添加其他水果。这样可以吗?

要解决此问题,请尝试更改Class<Blah>Class<? extends Blah>

您还可以更改您的Dummy类以使用泛型类型T

class class Dummy<T extends Blah> {
    Class<T> interfaceType;

    public void setInterfaceType(Class<T> input) {
        this.interfaceType = input;
    }
}

并像使用它一样

Dummy<Inter> dummyObj = new Dummy();
dummyObj.setInterfaceType(Inter.class);
于 2013-10-17T02:30:03.513 回答
0

你最肯定的意思是

Class<? extends Blah> interfaceType;

public setInterfaceType( Class<? extends Blah> input ) {
    this.interfaceType = input;
}  

更新

如果 Dummy 类不能被修改,那么它是相当可疑的,为什么会有这样一个 setter 方法。但无论如何,您可以通过将参数转换为 Class (不带类型参数)来避免“通用类型”检查,如: dummyObj.setInterfaceType( (Class) Inter.class )

于 2013-10-17T02:31:42.553 回答