Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
189 views
in Technique[技术] by (71.8m points)

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

  }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

你的 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 的时候,其参数类型就是确定的


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...