程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> javaee-對於Java泛型的一些疑問!求大神解答!

javaee-對於Java泛型的一些疑問!求大神解答!

編輯:編程解疑
對於Java泛型的一些疑問!求大神解答!

全部代碼如下,問題在第一個代碼片中

package ref;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import ref.annotation.ExcelField;
import ref.model.Emp;
//測試類
public class Test {

    public static void main(String[] args) throws Exception {
        outExcel(initData());
    }
    //利用反射輸出數據
    public static <T> void outExcel(List<T> list) throws Exception{
        Field[] declaredFields = list.get(0).getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            ExcelField annotation = field.getAnnotation(ExcelField.class);
            System.out.println(annotation.key());
        }
        /*
         * =======================================
         * ================問題如下===============
         * =======================================
         */

        /*
         * 這裡有幾個地方,我沒看懂
         * 1、<T>這是個泛型,泛型一般不都是定義在類後面嗎?泛型定義在方法上會不會不好?
         * 2、下面的沒看懂代碼片中
         */
        for(int i=0;i<list.size();i++){
            /*------------沒看懂代碼片-開始--------------*/
            //這個獲取的是Emp類型
            T t = list.get(i);
            //這個是Emp的屬性數組
            Field[] fields = t.getClass().getFields();
            for (Field field : fields) {
                //field這是屬性
                //field.get(t) 這句話我就不理解了
                //為什麼屬性獲取Emp類,可以獲取到屬性的值
                Object object = field.get(t);
                /*------------沒看懂代碼片-結束--------------*/
                if(object instanceof Integer) System.out.println((Integer)object);
                if(object instanceof String) System.out.println((String)object);
                if(object instanceof Timestamp) System.out.println((Timestamp)object);
            }
        }
    }
    //構造數據
    private static List<Emp> initData() {
        List<Emp> emps = new ArrayList<Emp>();
        Emp emp;
        for(int i=0;i<3;i++){
            emp = new Emp(i,UUID.randomUUID().toString(),new Timestamp(System.currentTimeMillis()));
            emps.add(emp);
        }
        return emps;
    }
}



 package ref.model;
import java.sql.Timestamp;
import ref.annotation.ExcelField;
public class Emp {
    @ExcelField(key = "編號")
    public Integer id;
    @ExcelField(key = "名字")
    public String name;
    @ExcelField(key = "創建時間")
    public Timestamp createTime;

    public Emp(Integer id, String name, Timestamp createTime) {
        super();
        this.id = id;
        this.name = name;
        this.createTime = createTime;
    }
}

package ref.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//@Target,約束之用,告訴計算機,此注解可以被放在哪些元素之前
@Target({
    ElementType.FIELD,
    ElementType.METHOD
})
//@Retention,告訴計算機,此注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelField {
    String key();
}

最佳回答:


說說我的看法吧。泛型之所以會寫在類名後面,那是因為這個泛型貫穿了整個類,是這個類的一個很重要的類型。但明顯 T 不是,它僅僅就被使用了一次,然後這個V感覺也沒什麼用。所以如果T的確是某個成員變量的類型,你可以定義到類名後面。
第二個//這個獲取的是Emp類型 t是一個對象 由t可以獲取t的class對象。由class對象可以獲得t的類的屬性。通過field.get(t) 傳入一個對象。
相當於就是t.getXX(); 這個方法的效果就是這樣。。
T t = list.get(i);
//這個是Emp的屬性數組
Field[] fields = t.getClass().getFields();
for (Field field : fields) {
//field這是屬性
//field.get(t) 這句話我就不理解了
//為什麼屬性獲取Emp類,可以獲取到屬性的值
Object object = field.get(t);
/*------------沒看懂代碼片-結束--------------*/

u013179958
u013179958
u013179958
u013179958
u013179958
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved