Java:将泛型类型传递给另一个泛型类型

时间:2014-04-07 07:21:03

标签: java generics

Main.Java:创建通用类型的Test对象的Main类 Test.Java:它的Generic类,它创建泛型类的Wrapper类的对象 Wrapper.java:它是一个通用类型 我们传递String,Long作为创建Test.java对象的类型。并且传递long作为创建Wrapper类对象的类型。 Main.Java:

    public class MainClass {
   Test<String,Long> test;

   MainClass()
   {
       test = new Test<String,Long>(){};   
   }
   public static void main(String[] arr)
   {
       MainClass m = new MainClass();
   }
  }

Test.Java

     public class Test<T,U> 
    {
     Wrapper<U> mywrapper;
    Test()
    {
      Type type = this.getClass().getGenericSuperclass();
      System.out.println("TYPE: " + type.toString());

      Type type1 = ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
      System.out.println("TYPE1: " + type1.getClass().getName());


      Type[] types = ((ParameterizedType)type).getActualTypeArguments();

      for (int i = 0; i < types.length; i++) {
      System.out.println("TYPES[" + i + "]: " + types[i].toString());
      }
      mywrapper = new Wrapper<U>(){};
  }
}

Wrapper.Java

 public class Wrapper<U> {
  Wrapper()
  {
      Type type = this.getClass().getGenericSuperclass();
      System.out.println("TYPE: " + type.toString());

      Type type1 = ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
      System.out.println("TYPE1: " + type1.getClass().getName());


      Type[] types = ((ParameterizedType)type).getActualTypeArguments();

      for (int i = 0; i < types.length; i++) {
      System.out.println("TYPES[" + i + "]: " + types[i].toString());
      }
  }
}

执行程序后,我们得到输出为
        类型:测试         TYPE1:java.lang.Class         TYPES [0]:类java.lang.String         TYPES [1]:类java.lang.Long          TYPE:Wrapper         * TYPE1:sun.reflect.generics.reflectiveObjects.TypeVariableImpl         TYPES [0]:U *

因此,从输出中你可以看到Wrapper类,我们得到的是Type为U而不是Long,正如你在Test.Java中看到的那样。

4 个答案:

答案 0 :(得分:2)

希望以下计划能澄清您的疑问。

public class VMGeneric<A>
{
    private A objVariable;

    public VMGeneric(A localVariable)
    {
        objVariable = localVariable;
    }

    public String getNameOfGenericType()
    {
        return objVariable.getClass().getCanonicalName();
    }

    public static void main(String[] args)
    {
        VMGeneric<String> o1 = new VMGeneric<>("");
        VMGeneric<Object> o2 = new VMGeneric<>(new Object());

        System.out.println(o1.getNameOfGenericType());
        System.out.println(o2.getNameOfGenericType());
    }
}

答案 1 :(得分:0)

  

所以从输出中你可以看到我们得到的Wrapper类   如Test.Java中所示,键入U而不是Long。

右。类元数据反映了编译时编写的内容。因此,为了获得类型,它必须在编译时进行硬编码。

答案 2 :(得分:0)

是否可以在Wrapper.java中获取参数的类型。实际上我的怀疑是为什么它在第一级间接工作而不是为Wrapper.java工作。我在代码中发现的问题是mywrapper = new Wrapper(){};将创建一个U类型的匿名类,这就是它将U打印为数据类型的原因。但是如果我删除{}那么我得到classclassException为Wrapper.java

 java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

答案 3 :(得分:0)

仅供参考:在Wrapper中,U不是参数。相反,你说的是你的类可以接受任何类型的对象而不是U.在你传递真实对象之前,没有人会知道。 U再次不是参数。