大佬教程收集整理的这篇文章主要介绍了如何将 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,请注明来意。