Java 如何获取Foo<;类型的类实例;T>;(Foo<;T>;。课堂不工作)
我想得到FooJava 如何获取Foo<;类型的类实例;T>;(Foo<;T>;。课堂不工作),java,Java,我想得到Foo.class的类(确切地说是Foo,既不是T.class也不是Foo.class) 公共A类扩展B类{ 公共A(){ 超级(C.class);//不工作 } } 在StackOverflow上有一条通过注入构造函数来获取泛型类的指令,但这不是我的情况,因为C.class(例如List< 字符串>.class)是语法错误。在这里,它似乎与语法有关,而不是与代码结构有关 为了显示更详细、更高级的视图,原始代码如下所示,它在Spring框架中的HATEOAS模块: public cla
公共A类扩展B类{
公共A(){
超级(C.class);//不工作
}
}
在StackOverflow上有一条通过注入构造函数来获取泛型类的指令,但这不是我的情况,因为Cpublic class CustomerGroupResourceAssembler extends ResourceAssemblerSupport<CustomerGroup, CustomerGroupResource>{
public CustomerGroupResourceAssembler() {
super(CustomerGroupController.class, CustomerGroupResource.class);
}
}
public class CustomerGroupResource extends ResourceSupport {
private CustomerGroup data;
}
公共类CustomerGroupResourceAssembler扩展了ResourceAssemblerSupport{
公共CustomerGroupResourceAssembler(){
super(CustomerGroupController.class、CustomerGroupResource.class);
}
}
公共类CustomerGroupResource扩展了ResourceSupport{
私有客户组数据;
}
但是现在我想参数化CustomerGroupResource以
public class Resource<T> extends ResourceSupport {
private T data;
}
公共类资源扩展了ResourceSupport{
私有T数据;
}
然后
public class CustomerGroupResourceAssembler extends ResourceAssemblerSupport<CustomerGroup, Resource<CustomerGroup>>{
public CustomerGroupResourceAssembler() {
super(CustomerGroupController.class, Resource<CustomerGroup>.class); // not work here, even Resource.class
}
}
公共类CustomerGroupResourceAssembler扩展了ResourceAssemblerSupport{
公共CustomerGroupResourceAssembler(){
super(CustomerGroupController.class,Resource.class);//这里不工作,甚至Resource.class
}
}
不幸的是,由于类型擦除,您尝试执行的操作是不可能的
有关泛型类型的信息仅在编译时可用,在运行时不可用。这是在Java中使用泛型的最大限制之一。这样做的原因是为了保持向后兼容性
请参见由于类型擦除,泛型仅在编译时适用,在运行时没有任何意义。你能做的就是
public class A extends B<C<D>>{
public A() {
super((Class<C<D>>) C.class);
}
}
印刷品
Main.Main$B<java.util.function.Supplier<java.lang.String>>
Main.Main$ResourceAssemblerSupport<Main$CustomerGroup, Main.Main$Resource<Main$CustomerGroup>>
class Main$ResourceAssemblerSupport <class Main$CustomerGroup, Main.Main$Resource<Main$CustomerGroup>>
java.util.List<java.lang.String>
Main.Main$B
编辑您可以执行的特定示例
import java.lang.reflect.Type;
public interface Main {
class ResourceSupport {
}
class CustomerGroup {
}
public class Resource<T> extends ResourceSupport {
private T data;
}
abstract class ResourceAssemblerSupport<C, R> {
protected ResourceAssemblerSupport() {
Type type = getClass().getGenericSuperclass();
System.out.println(type);
ParameterizedType pt = (ParameterizedType) type;
Type[] actualTypeArguments = pt.getActualTypeArguments();
Class first = (Class) actualTypeArguments[0];
ParameterizedType second = (ParameterizedType) actualTypeArguments[1];
System.out.println(pt.getRawType() + " <" + first + ", " + second + ">");
}
}
public class CustomerGroupResourceAssembler extends ResourceAssemblerSupport<CustomerGroup, Resource<CustomerGroup>>{
public CustomerGroupResourceAssembler() {
}
}
public static void main(String[] args) {
new CustomerGroupResourceAssembler();
}
}
import java.lang.reflect.Type;
公共接口主{
班级资源支持{
}
类CustomerGroup{
}
公共类资源扩展了ResourceSupport{
私有T数据;
}
抽象类ResourceAssemblerSupport{
受保护的ResourceAssemblerSupport(){
类型Type=getClass().getGenericSuperclass();
系统输出打印项次(类型);
ParameteredType pt=(ParameteredType)类型;
类型[]actualTypeArguments=pt.getActualTypeArguments();
Class first=(Class)实际类型参数[0];
ParameteredType second=(ParameteredType)实际类型参数[1];
System.out.println(pt.getRawType()+“”);
}
}
公共类CustomerGroupResourceAssembler扩展了ResourceAssemblerSupport{
公共CustomerGroupResourceAssembler(){
}
}
公共静态void main(字符串[]args){
新的CustomerGroupResourceAssembler();
}
}
印刷品
Main.Main$B<java.util.function.Supplier<java.lang.String>>
Main.Main$ResourceAssemblerSupport<Main$CustomerGroup, Main.Main$Resource<Main$CustomerGroup>>
class Main$ResourceAssemblerSupport <class Main$CustomerGroup, Main.Main$Resource<Main$CustomerGroup>>
java.util.List<java.lang.String>
Main.Main$ResourceAssemblerSupport
类主$ResourceAssemblerSupport
一种通用的方法是使用helper函数,但是我认为在您的情况下不需要这样做
public static void main(String[] args) {
System.out.println(new ClassType<List<String>>() {}.getType());
}
interface ClassType<T> {
default Type getType() {
ParameterizedType type = (ParameterizedType) getClass().getGenericInterfaces()[0];
return type.getActualTypeArguments()[0];
}
}
publicstaticvoidmain(字符串[]args){
System.out.println(新类类型(){}.getType());
}
接口类类型{
默认类型getType(){
ParameteredType type=(ParameteredType)getClass().GetGenericInterface()[0];
返回类型。getActualTypeArguments()[0];
}
}
印刷品
Main.Main$B<java.util.function.Supplier<java.lang.String>>
Main.Main$ResourceAssemblerSupport<Main$CustomerGroup, Main.Main$Resource<Main$CustomerGroup>>
class Main$ResourceAssemblerSupport <class Main$CustomerGroup, Main.Main$Resource<Main$CustomerGroup>>
java.util.List<java.lang.String>
java.util.List
没有C.class这样的东西。你们到底想实现什么?我想得到C类,但它是一个类型参数。所以,当一个方法需要C类时(可能包括该类型参数,因为当我传递C.class时,它不被接受)。所以我不知道该怎么做,我明白。但在更高的层次上,你想要实现什么。您使用这个类实例的目的是什么?为什么需要它?做什么?谢谢你,我编辑了我的问题以获取更多细节。请再读一遍!您还没有解释ResourceAssemblerSupport为什么需要类实例以及它对这些实例的作用。@downvoter知道为什么吗?请为您的热情投票(不要投票给我)。我试试看。非常感谢。@ngocchien虽然您可以使用我的上一个示例,但我认为最好不要首先指定它。我尝试了您的上一个示例,但代码中的super()不允许调用实例方法(无论如何,它应该是构造函数中的第一个调用)。也许我应该复制粘贴更多以减轻麻烦:),再次感谢您的帮助。@ngocchien您可以将其分配给静态字段,这样它就不会获得实例上下文。