当前位置: 首页 > 面试题库 >

将参数化的Class实例传递给构造函数

壤驷经国
2023-03-14
问题内容

我迷失在通用丛林中,请帮助我:)我有这样的事情:

public class BaseClass<TYPE> {
    public BaseClass(Class<TYPE> clazz) {};
}

public class FirstLevelClass<REFRESHABLE 
    extends RefreshableInterface> extends BaseClass<REFRESHABLE> {

    public FirstLevelClass(Class<REFRESHABLE> clazz) {
        super(clazz);
    };
}

public class Argument<T extends AnyOtherClass> 
    implements RefreshableInterface {

    public refresh() {}
}

pulbic class ProblematicClass 
    extends FirstLevelClass<Argument<AnyOtherClassDescendant>> {

    public ProblematicClass() {
        //Compiler error: Constructor 
        //FirstLevelClass<Argument<AnyOtherClassDescendant>>(Class<Argument>) is undefined
        super(Argument.class); 
    }
}

据我认为,编译器应该Argument实现,因为它实现了RefreshableInterface

  • 为什么会出现此错误?
  • 我该如何ProblematicClass工作?

ps:如果您对此有更好的标题,请进行更改。我无法弥补。


问题答案:

问题是,您的构造函数需要一个Class<T>,并且T在您的代码中将其推断为Argument<AnyOtherClassDescendant>

因此,您应该通过Class<Argument<AnyOtherClassDescendant>>,然后通过Class<Argument>。但是您不能像那样Class直接传递该实例Argument<AnyOtherClassDescendant>.class

但是,您可以通过将类强制转换为所需实例来解决此问题:

public ProblematicClass() {
    super((Class<Argument<AnyOtherClassDescendant>>)(Class<?>)Argument.class); 
}

请注意,如何首先将转换Class<Argument>Class<?>,然后将最终的类型转换为Class<Argument<AnyOtherClassDescendant>>。没有简单的方法可以做到这一点。

其背后的原因是,Class与类本身相关联的泛型类型的所有参数化实例只有一个实例。通用类型的单个编译单元仅编译为单个类文件。我想这与C
++实施模板的方式不同。在那里,您将获得用于不同实例化的不同机器代码。

因此,如果执行以下代码,则将得到true输出:

List<String> strList = new ArrayList<String>();
List<Integer> intList = new ArrayList<Integer>();

boolean isSameClassInstance = strList.getClass() == intList.getClass();
System.out.println(isSameClassInstance);


 类似资料:
  • 我试图将构造函数参数动态传递给Springboot框架中的一个bean。我已经使用context.getBean(class,arg...)在Spring中动态传递构造函数参数,但它没有成功获取值并显示默认值。我的代码有什么问题? 项目结构: 应用程序上下文.xml 应用 活动 输出:

  • 问题内容: 我的工厂如下 这是Foo的定义: 好。我不确定如何使用Guice将此参数传递给Foo构造函数? 有任何想法吗? 问题答案: 所有“ Guice构造函数参数”答案在某种程度上似乎都不完整。这是一个完整的解决方案,包括用法: //在实现类上注释构造函数和辅助参数 //使用仅接受辅助参数的create()方法创建工厂接口。 // FooFactory接口没有显式的实现类(Guice Magi

  • 我正在尝试通过:如果流文件; 在我的主()中,到一个名为“FIFO”的类的构造函数:FIFO(文件); 在FIFO(FIFO.h)的头文件中,我有: 在FIFO.cc,我有: 我一直喜欢(还有更多,我只是粘贴其中一个): 在文件包括从/usr/lib/gcc/x86_64-redhat linux/4.4.7/…/…/…/…/包含/c /4.4.7/bits/localefwd.h: 43,从/u

  • 我为什么要这样做?因为lambda表达式生成的ClosureType不是默认可构造的。通过这个“技巧”,我可以默认构造这样的closureType。 此外,模板参数的要求是,它必须为空=>

  • 我创建了一个Author对象,用于构造函数的方法签名:public Book但是,我所做的赋值要求将Author(实例变量)更改为。当然,现在我以前的构造函数不行了。这是密码 如果我上传的方式不令人满意,我对任何不便表示歉意。我还没有学会使用堆栈溢出。 谢谢!

  • 问题内容: 考虑以下python代码段 我想知道我是如何能够及格,并以相应的基类的构造函数。 问题答案: 好吧,一般而言,在处理多重继承时,您的基类(不幸的是)应该 设计为多重继承 。类和在你的例子都没有,这样的话你找不到适用有道的。 设计基类以进行多重继承的一种常见方法是,中级基类在其方法中接受他们不打算使用的额外的args ,并将它们传递给调用。 这是在python中执行此操作的一种方法: 这