1. 程式人生 > >父類如何獲取子類傳遞的泛型

父類如何獲取子類傳遞的泛型

str 父類 image 轉載 class argument pretty edge pub

package com.reflect.other;

import java.io.Serializable;

/**
 * 簡單pojo類(測試用,無具體意義)
 * 
 * @author edgewalk
 * @date 2017年6月5日
 */
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;

    public
Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
package com.reflect.other;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 父類
 * 
 * @author edgewalk
 * @date 2017年6月5日
 * @param <T>泛型,可以由之類繼承傳遞
 */
public class Parent<T> {
    /**
     * 用於接收傳遞的clazz
     */
private Class clazz; // 獲取子類傳遞給他的具體泛型類型 public Parent() { // 1獲取子類的class(在創建子類對象的時候,會返回父類的構造方法) Class<? extends Parent> clazz = this.getClass(); // Student // 2獲取當前類的帶有泛型的父類類型 ParameterizedType type = (ParameterizedType) clazz.getGenericSuperclass(); // 3返回實際參數類型(泛型可以寫多個) Type[] types = type.getActualTypeArguments(); // 4 獲取第一個參數(泛型的具體類) Person.class clazz = (Class) types[0]; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
package com.reflect.other;
/**
 * 子類
 * @author edgewalk
 * @date  2017年6月5日
 */
public class Student extends Parent<Person> {
    /**
     * 當我們創建本類對象的時候,會先創建一個student類的空參構造,
     * 然後會返回父類的空參構造(Parent),此時父類就會獲取到子類傳遞給他的泛型,在父類中執行相關操作
     */
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

父類如何獲取子類傳遞的泛型