Java泛型 <T> T 的作用

  <T> T  表示返回值和传入参数的泛型类型一致,代码示例:

package GenericStudy;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: java泛型返回值 <T>T 的作用
 **/
public class Demo2 {
    public static void main(String[] args) {
        Demo2 d1 = new Demo2();

        //例1
        List<String> arr = new ArrayList<>();
        arr.add("a");
        arr.add("b");
        String str = d1.getListFirst(arr);
        System.out.println(str);

        //例2
        String[] strArray=new String[]{"aa","bb","cc"};
        List<String> list= d1.copyFromArrayToList(strArray);

    }

    /**
     * 关于参数T1的说明:
     * 第一个T1表示<T1>是一个泛型
     * 第二个T1表示方法返回的是T类型的数据
     * 第三个T1表示集合List传入的数据是T类型
     */
    private <T1> T1 getListFirst(List<T1> data) {
        if (data == null || data.size() == 0) {
            return null;
        }
        return data.get(0);
    }

    /**
     * 传入T2类型数组返回List<T2>
     */
    private <T2> List<T2> copyFromArrayToList(T2[] arr) {
        List<T2> list = new ArrayList<>();
        for (T2 e : arr) {
            list.add(e);
        }
        return list;
    }
}

下图是从其他文章中截取的,其中注释解释“限制“T”为String类型”是有误的,下面会进行解释。

这个例子能正常运行是因为 Demo2<T> 和 private <T> T getListFirst(List<T> data) 中的T 不一样,

完全可以写为:Demo2<T1> 和 private <T2> T2 getListFirst(List<T2> data) ,

这里 private <T2> T2 getListFirst(List<T2> data) 只是用于要求返回和参数类型一致。

package GenericStudy;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: java泛型返回值 <T>T 和T的区别
 **/
public class Demo2<T> {
    public static void main(String[] args) {
        Demo2<Integer> d1 = new Demo2<>(); 
        List<String> arr = new ArrayList<>();
        arr.add("a");
        arr.add("b");
        String str = d1.getListFirst(arr);
        System.out.println(str);

    }

    /**
     * 关于参数T的说明:
     * 第一个T表示<T>是一个泛型
     * 第二个T表示方法返回的是T类型的数据
     * 第三个T表示集合List传入的数据是T类型
     *
     * @param data
     * @param <T>
     * @return
     */
    private <T> T getListFirst(List<T> data) {
        if (data == null || data.size() == 0) {
            return null;
        }
        return data.get(0);
    }
}

若改为  private T getListFirst(List<T> data),则编译不通过,报需要List<Integer>类型作为参数,

这里是因为 Demo2<T> 和 private T getListFirst(List<T> data) 用的是同一个类型参数T,

要求  传入参数 List<T>     和    对象 Demo2<T>   中T类型一致。

猜你喜欢

转载自blog.csdn.net/Ahuuua/article/details/124620222