程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何将 Class<?> 转换为泛型类型大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何将 Class<?> 转换为泛型类型?

开发过程中遇到如何将 Class<?> 转换为泛型类型的问题如何解决?下面主要结合日常开发的经验,给出你关于如何将 Class<?> 转换为泛型类型的解决方法建议,希望对你解决如何将 Class<?> 转换为泛型类型有所启发或帮助;

我有一个方法返回 Class<? extends Animal>

public Class<? extends Animal> getAnimal(Animal animal)
{
    //....
}

在参数 passGenericAnimal(D animal); 中接受泛型的另一种方法

我想从 getAnimal() 方法获取一个 Animal 类类型,我只想通过将其转换为泛型类型来传递给 passGenericAnimal() 方法。

像这样:

public Class<? extends Animal> getAnimal()
{
    return lion.class;
}

public <T extends Animal> voID convertToGenericsAndAssign()
{
    T animal = getAnimal();
    //getting error here
    //Type mismatch: cannot convert from Class<capture#15-of ? extends Animal> to T
    passstring(animal);
}

public voID passGenericAnimal(D animal)
{
    //....;
}

有没有什么办法可以把Class类型转换成Generics类型?

解决方法

我可以给你一些关于如何编译的提示,但我怀疑你在任何情况下都走错了路。即使您的代码编译(并运行),它也可能不会做您认为它会做的事情。但是,目前,只是编译发生了变化:

public Class<? extends Something> getSomeClass() {
    return SomethingSpecific.class;
}

public void convertToGenericsAndAssign() {
    Class<? extends Something> str = getSomeClass();
    // you are getting a class object. You need to actually store a class to make it work.
    passString(str);
}

public <D extends Something> void passString(Class<D> strType) {
    // ....;
}

public static class Something {}

public static class SomethingSpecific extends Something {}

我将类型从 String(不可扩展)更改为 Something

正如您在示例中看到的,问题在于您实际上是从您的方法中获取 Class 对象。我不完全确定您为什么期望实际对象的实例。 如果你想实例化那个类的一个对象,那么下面的代码可能会有所帮助:

public Class<? extends Something> getSomeClass() {
    return SomethingSpecific.class;
}

public void convertToGenericsAndAssign() {
    Class<? extends Something> someClass = getSomeClass();
    // try to get an parameter free constructor:
    
    try {
        Constructor<? extends Something> constructor = someClass.getConstructor();
        Something instance = constructor.newInstance();
        
        // Be aware,that the generic type `D` i smore or less just `Something`,// because the compiler cannot know at compile time,what subclass of `Something`
        // D should actually be. So it can just induce `Something`.
        passSomething(instance);
        
    } catch (NoSuchMethodException e) {
        // Handle,if the class does not have an empty constructor.
        e.printStackTrace();
        
    } catch (SecurityException e) {
        // Handle,if the constructor is not accessible,or if the
        // VM does not allow reflection.
        e.printStackTrace();

    } catch (InstantiationException e) {
        // Handle,if the instance failed to be created.
        e.printStackTrace();
        
    } catch (IllegalAccessException e) {
        // Handle,if the metohd is e.g. private or something.
        e.printStackTrace();
        
    } catch (IllegalArgumentException e) {
        // This should not be thrown,as you pass no arguments,but
        // you still have to catch it.
        e.printStackTrace();
        
    } catch (InvocationTargetException e) {
        // If the constructor threw an internal exception.
        e.printStackTrace();
    }
}

public <D extends Something> void passSomething(D strType) {
    // ....;
}

public static class Something {}

public static class SomethingSpecific extends Something {}

大佬总结

以上是大佬教程为你收集整理的如何将 Class<?> 转换为泛型类型全部内容,希望文章能够帮你解决如何将 Class<?> 转换为泛型类型所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: