java 泛型获取

  • java如何获取泛型的具体类型, 基本代码如下. 目标是可以通过 clazz()方法来输出当前的泛型类型.
import java.math.BigDecimal;

interface Parent<T> {

  void clazz();
}

class Child<T> implements Parent<T> {

  @Override
  public void clazz() {
  }
}


public class RefDemo {

  public static void main(String[] args) {
    Parent<Double> doubleChild = new Child<>();
    doubleChild.clazz();// 期望输出 Double.class
    Parent<BigDecimal> bigDecimalChild = new Child<>();
    bigDecimalChild.clazz(); // 期望输出 BigDecimal.class

  }
}
阅读 2.2k
2 个回答

题主你理解错了泛型的用法,泛型是 参数化类型

你的 Parent<T> 中的 T 是个声明了一个参数类型 T ,T 是一个 “参数”, 其传入的值为 java 类。

怎么传值?

class Child implements Parent<Map>

在你实现 Parent 接口的时候就是传 参数类型的时候,也就是说 Child 中所有的 T 参数传入的就是 Map

你上面写的代码

class Child<T> implements Parent<T>

Parent<T> 会报错,因为你没有一个叫 T 的java类
Child<T> 的意思是 Cild 这个类也申明了一个 参数类型 T

也就是你在写一个子类继承 Child 的时候需要写上这个 T 具体是什么类型的

class Test extends Child<String>

当然如果你不写具体的类型,那么你申明的泛型就是 Object 类型的。
你也可以在具体使用的时候写上此时的参数类型是什么

Child<Map> c =  new Child()

另外,你的 Parent<T> 接口写的是有问题的
你申明了一个 参数类型 T 但是你接口方法却没有使用他,也就是这个 T 参数完全没有用到

你的方法可以改造下

public T clazz() 

或者

public void clazz(T t) 

那么你在实现 Parent 的时候,其参数类型就是确定的

最简单的方法就是把泛型 Class 通过构造函数注入进去:

public class Child<T> implements Parent<T> {

    private Class<T> cls;

    public Child(Class<T> cls) {
        this.cls = cls;
    }

    @Override
    public Class<T> clazz() {
        return cls;
    }
}

当然还有更复杂的通过反射的方法, 但是因为类型擦除, 类自己的反射是获取不到自身的泛型类型的, 必须通过泛型类型元素的母元素反射获取:

public class Main {

    public List<String> list;

    public static void main(String[] args) throws Exception {
        // 这样是拿不到泛型类型 Integer
        List<Integer> l = new ArrayList<>();
        // 输出的是 ArrayList 声明的泛型变量 T
        final TypeVariable<? extends Class<? extends List>>[] types = l.getClass().getTypeParameters();
        for (TypeVariable<? extends Class<? extends List>> type : types) {
            System.out.println(type.getName());
        }

        // 这样是可以拿到泛型类型 String
        final Field list = Main.class.getField("list");
        final Type genericType = list.getGenericType();
        System.out.println(genericType.getTypeName());
        if(genericType instanceof ParameterizedType) {
            ParameterizedType t = (ParameterizedType) genericType;
            System.out.println(Arrays.toString(t.getActualTypeArguments()));
        }
    }
}

Type 类型参考 https://www.jianshu.com/p/39c...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题