靜態方法上的泛型

泛型也可以僅定義在靜態方法上,舉例而言,在 定義與使用泛型 中自定義過支援泛型的ArrayList,如果現在想寫個asArrayList方法,可指定不定長度引數,將之轉換為ArrayList,則可以如下:

package cc.openhome;

public class Util { public static <T> ArrayList<T> asList(T... a) { ArrayList<T> arrLt = new ArrayList<>(); for(T t : a) { arrLt.add(t); } return arrLt; }}

想使用這個asList()方法,完整的泛型宣告語法如下:

ArrayList<String> arrLt = Util.<String>asList("B", "X", "A", "M", "F", "W", "O");

實際上,編譯器可以從asList()的引數,瞭解到型態參數T實際上是String型態,因此,可以簡化撰寫為:

ArrayList<String> arrLt = Util.asList("B", "X", "A", "M", "F", "W", "O");

某些方法宣告下,編譯器無法從引數推斷型態參數的實際型態,那就可能從其他管道來進行推斷。例如,你可能如下定義:

...
public class BeanUtil {
    public static <T> T getBean(Map<String, Object> data, String clzName)
                                   throws Exception {
        Class clz = Class.forName(clzName);
        ...略
        return (T) bean;  
    }
}

想使用這個程式片段中的getBean()方法,完整語法可以如下:

Student student = BeanUtil.<Student>getBean(data, "cc.openhome.Student");

就以上片段來說,其實編譯器可以從student的型態推斷,型態參數T應該是Student,因此可以簡化撰寫為:

Student student = BeanUtil.getBean(data, "cc.openhome.Student");

編譯器會自動推斷T代表的型態,就不用額外指定<Student>,完整語法是想在鏈狀操作時使用。例如:

String name = BeanUtil.<Student>getBean(
                     data, "cc.openhome.Student").getName();

在上例,如果沒有指定<Student>,那麼就無法呼叫傳回的Student物件getName()方法,因為編譯器會將getBean()傳回的物件型態當作Object處理,而Object上並不會有getName()方法,因而發生錯誤,這跟上面的UtilasList()可以比較一下:

Util.asList("B", "X", "A", "M", "F", "W", "O").get(10).toUpperCase();

這個語法不會發生錯誤,因為編譯器可以從asList()的引數,瞭解到型態參數T實際上是String型態,因而傳回型態會是ArrayList<String>,而呼叫get(10)會傳回String,因而最後可以呼叫toUpperCase()

編譯器的型態推斷是很方便的功能,實際上你也早用過型態推斷而得到方便性,在 陣列複製 中使用過java.util.ArrayscopyOf()方法,實際上你不用使用CAST語法,例如:

String[] words = {"A", "X", "B", "Y"};
String[] newWords = Arrays.copyOf(words, words.length * 2);

java.util.ArrayscopyOf()方法可以接受任何型態的陣列,是因為其宣告上使用了泛型:

public static <T> T[] copyOf(T[] original, int newLength)

因此,編譯器可以從引數得知型態參數實際型態,強大的類型推斷對需要宣告變數型態的語言來說,有助於語法的簡化,尤其對Java在JDK8引入Lambda之後,會更加方便,對Lambda語法的可讀性有極大的助益,這之後還會再看到介紹。

java 静态方法上的泛型相关推荐

  1. Java基础篇:泛型与类型擦除

    一.什么是泛型: 泛型的本质是 参数化类型,也就是说 将所操作的数据类型 指定为一个参数,在不创建新类的情况下,通过参数来指定所要操作的具体类型(类似于方法中的变量参数,此时类型也定义成参数形式),也 ...

  2. java实验泛型与容器总结_【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

  3. 《重学Java系列》之 泛型(上)

    不诗意的女程序媛不是好厨师~ [转载请注明出处,From李诗雨-https://blog.csdn.net/cjm2484836553/article/details/103278750] ✍ [篇外 ...

  4. Java这个高级特性-泛型,很多人还没用过!

    点击关注公众号,Java干货及时送达 泛型是 Java 的高级特性之一,如果想写出优雅而高扩展性的代码,或是想读得懂一些优秀的源码,泛型是绕不开的槛.本文介绍了什么是泛型.类型擦除的概念及其实现,最后 ...

  5. Java笔记05-Collection、泛型、迭代器

    Java笔记05-Collection.泛型.迭代器 [Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 ...

  6. 声明方法java实际开发中泛型使用需要注意的一些问题

    在写这篇文章之前,xxx已经写过了几篇关于改声明方法主题的文章,想要了解的朋友可以去翻一下之前的文章 1.Map<K,V> 声明的泛型类型必须是类,不能是基本类型.如果是基本类型将其写为对 ...

  7. java史上最全面试题(转载于骆昊)

    2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...

  8. Java基础系列12: 泛型

    Java基础系列12: 泛型 本文是作者的读书笔记和心得整理,部分内容来源于网络,如有侵权,请联系作者. 什么是泛型 直接看例子 List arrayList = new ArrayList(); a ...

  9. 小白学JAVA之十八——泛型

    小白学JAVA之十八--泛型 一. 基本概念 通常情况下集合中可以存放不同类型的对象,是因为将所有对象都看做Object类型放入的,因此从集合中取出元素时也是Object类型,为了表达该元素真实的数据 ...

最新文章

  1. 第十六届智能汽车竞赛AI视觉组分赛区数据集发布
  2. 关于spring事务管理
  3. Linux下载安装一个源码包
  4. OS- -请求分页系统、请求分段系统和请求段页式系统(一)
  5. 【Elasticsearch】es fielddata 字段数据
  6. Python编程语言中获取操作系统进程信息的方法
  7. Eclipse运行慢
  8. html中div页面布局,前端入门篇(二):利用Div + CSS快速布局页面
  9. 万年历matlab算法,万年历算法(万年历算法和分析)
  10. 聊一聊数据分析师这个职业
  11. 年轻人逃离算法?更懂你的时尚推荐算法,你会拒绝吗?| FashionHack 专栏
  12. 新人上路,以菜鸟之名,对现在已学以及将来要学的进行一个简单的梳理,希望多多指教
  13. Qlik view 连接数据库
  14. 推荐系统 - 排序算法 - 神经网络:FNN 论文阅读
  15. Access-Control-Allow-Headers是什么?有什么作用?
  16. protege 简介
  17. 什么是爬电距离?宽爬电距离光耦为什么越来越受大家青睐?
  18. 奥运了,愿明天会更好
  19. minikube 安装 Kubernetes Dashboard 并集成 Heapster
  20. 哪里可以找到原版经济学人?为什么读经济学人?

热门文章

  1. 远程访问×××——Easy ×××
  2. 视频可以转换html,10 个免费的 HTML 视频转换工具
  3. python -m uiautomator2 init 报错_Python|实现属于自己的数据类型
  4. VMware 虚拟化编程(15) — VMware 虚拟机的恢复方案设计
  5. Linux_Bash常用脚本
  6. 简洁高效的linux kfifo环形缓冲区
  7. 单片机程序下载方式ISP、IAP
  8. 逼格高又实用的 Linux 命令,运维同仁一定要懂
  9. 先进先出算法(FIFO)——页面置换
  10. el表达式判断字符串相等