繁体   English   中英

强制转换为超级类,输入“类”

[英]Cast to super class type a “Class”

我有一个界面

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> ,但这也是不允许的。 我不明白为什么它不接受子类类型的类。 谁能告诉我这里发生了什么以及如何调用设置器。 Dummy类是外部的,所以我不能更改它。

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

要解决此问题,请尝试将Class<Blah>更改为Class<? extends 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);

您最肯定的意思是

Class<? extends Blah> interfaceType;

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

更新资料

如果无法修改Dummy类,那么那就是dubius了,为什么会有这样的setter方法。 但是无论如何,您可以通过将参数强制转换为Class(不带type参数)来避免“泛型”检查,如下所示:dummyObj.setInterfaceType((Class)Inter.class)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM