转为超类类型“类”

时间:2013-10-17 02:23:49

标签: java inheritance encapsulation

我有一个界面

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类是外部的,所以我无法改变它。

2 个答案:

答案 0 :(得分:3)

Generics are not covariant因此您无法设置Class<Blah> 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);

答案 1 :(得分:0)

你肯定意味着

Class<? extends Blah> interfaceType;

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

<强>更新

如果Dummy类不能被修改,那么为什么有这样的setter方法就是dubius。但无论如何,你可以避免使用&#34;泛型类型&#34;通过将您的参数转换为Class(不带类型参数)来检查,如:dummyObj.setInterfaceType((Class)Inter.class)