()"获取 ParameterizedType E-6ren"> ()"获取 ParameterizedType E-下面我粘贴了我想要运行的示例。 我可以轻松获得 StringHome 的泛型类扩展 Home 的实例,但我不能对 new Home() 做同样的事情实例。我怎样才能获得它? 我的目标是制作mainKO-6ren">
gpt4 book ai didi

Java ClassCastException 从通用实例 "new ClazzXXX()"获取 ParameterizedType E

转载 作者:行者123 更新时间:2023-12-02 03:30:32 26 4
gpt4 key购买 nike

下面我粘贴了我想要运行的示例。

我可以轻松获得 StringHome 的泛型类扩展 Home<String> 的实例,但我不能对 new Home<String>() 做同样的事情实例。我怎样才能获得它?

我的目标是制作mainKO方法的工作原理为 mainOK确实如此。

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class Home<E> {
@SuppressWarnings ("unchecked")
public Class<E> getTypeParameterClass(){
Type type = getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) type;
return (Class<E>) paramType.getActualTypeArguments()[0];
}

private static class StringHome extends Home<String>{}
private static class StringBuilderHome extends Home<StringBuilder>{}
private static class StringBufferHome extends Home<StringBuffer>{}

public static void main(String[] args) throws Exception {
// this works fine
mainOK();
Thread.sleep(1000);
// this throws an error
mainKO();
}

/**
* This prints "String", "StringBuilder" and "StringBuffer"
*/
public static void mainOK() throws Exception {
Object object0 = new StringHome().getTypeParameterClass().newInstance();
Object object1 = new StringBuilderHome().getTypeParameterClass().newInstance();
Object object2 = new StringBufferHome().getTypeParameterClass().newInstance();
System.out.println(object0.getClass().getSimpleName());
System.out.println(object1.getClass().getSimpleName());
System.out.println(object2.getClass().getSimpleName());
}

/**
* This throws error:
* Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
*/
public static void mainKO() throws Exception {
Object object0 = new Home<String>().getTypeParameterClass().newInstance();
Object object1 = new Home<StringBuilder>().getTypeParameterClass().newInstance();
Object object2 = new Home<StringBuffer>().getTypeParameterClass().newInstance();
System.out.println(object0.getClass().getSimpleName());
System.out.println(object1.getClass().getSimpleName());
System.out.println(object2.getClass().getSimpleName());
}
}

该类的执行打印出以下内容:

String
StringBuilder
StringBuffer
Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at org.command4j.core.commands.utils.Home.getTypeParameterClass(Home.java:13)
at org.command4j.core.commands.utils.Home.mainKO(Home.java:46)
at org.command4j.core.commands.utils.Home.main(Home.java:26)

最佳答案

你不能。

要理解这一点,只需为每个对象的层次结构创建一棵树即可。

  • StringHome 的父类(super class)是 Home <java.lang.String> 。因此,当您调用 getGenericSuperclass() 时,您将获得该父类(super class)。然后就可以得到实际的类型参数String

但是

  • 首页 <String> 的父类(super class)是java.lang.Object。此外,在运行时,您丢失了参数,只能知道它是一个 Home 对象。

Java 泛型在编译时会删除泛型类型信息。您将无法在运行时获取此信息。

关于Java ClassCastException 从通用实例 "new ClazzXXX<E>()"获取 ParameterizedType E,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38148363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com