如何从getClass()获取的Class<?>对象中还原真实的String类型?
嘿,这个问题我之前也碰到过!其实Java里要把Class<?>还原成你要的String相关类型,核心是绕开编译器的泛型擦除限制,下面给你讲几种实用的处理方式:
方法1:强制转换为Class<String>
因为编译器没法静态确定c实际就是String的Class对象,所以需要显式强制转换,但会触发unchecked警告——毕竟运行时如果c不是String.class,会直接抛ClassCastException。
你可以先做类型校验,再配合注解压制警告,代码示例:
String s = "hello"; Class<?> c = s.getClass(); // 先校验类型,避免运行时异常 if (c == String.class) { // 压制unchecked警告 @SuppressWarnings("unchecked") Class<String> stringClass = (Class<String>) c; // 现在你可以用这个Class<String>做任何操作,比如创建实例 String newString = stringClass.getConstructor(String.class).newInstance("world"); System.out.println(newString); // 输出: world }
方法2:直接通过cast()获取String实例
如果你的目标只是得到String类型的实例,不用先转成Class<String>,直接用Class的cast()方法更便捷:
String s = "hello"; Class<?> c = s.getClass(); // 把任意对象强制转换为c代表的类型(这里就是String) String castedString = c.cast("this is a test"); System.out.println(castedString); // 输出: this is a test // 也可以创建新实例(注意处理反射异常) try { String emptyString = (String) c.getConstructor().newInstance(); System.out.println(emptyString); // 输出空字符串 } catch (Exception e) { e.printStackTrace(); }
为什么c.getClass()没用?
你提到调用c.getClass()还是得到Class类型,这是因为c本身就是一个Class对象,它的运行时类型是Class<Class>(元类),所以它的getClass()返回的是Class的Class对象,自然和String没关系啦,得从c本身入手转换才行。
内容的提问来源于stack exchange,提问作者Fabian Zbinden
相关产品推荐
相关产品推荐

