Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取Foo<;类型的类实例;T>;(Foo<;T>;。课堂不工作)_Java - Fatal编程技术网

Java 如何获取Foo<;类型的类实例;T>;(Foo<;T>;。课堂不工作)

Java 如何获取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

我想得到Foo.class的类(确切地说是Foo,既不是T.class也不是Foo.class)

公共A类扩展B类{
公共A(){
超级(C.class);//不工作
}
}
在StackOverflow上有一条通过注入构造函数来获取泛型类的指令,但这不是我的情况,因为C.class(例如List< 字符串>.class)是语法错误。在这里,它似乎与语法有关,而不是与代码结构有关

为了显示更详细、更高级的视图,原始代码如下所示,它在Spring框架中的HATEOAS模块:

public 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您可以将其分配给静态字段,这样它就不会获得实例上下文。