java 静态方法上的泛型
靜態方法上的泛型
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()
方法,因而發生錯誤,這跟上面的Util
的asList()
可以比較一下:
Util.asList("B", "X", "A", "M", "F", "W", "O").get(10).toUpperCase();
這個語法不會發生錯誤,因為編譯器可以從asList()
的引數,瞭解到型態參數T
實際上是String
型態,因而傳回型態會是ArrayList<String>
,而呼叫get(10)
會傳回String
,因而最後可以呼叫toUpperCase()
。
編譯器的型態推斷是很方便的功能,實際上你也早用過型態推斷而得到方便性,在 陣列複製 中使用過java.util.Arrays
的copyOf()
方法,實際上你不用使用CAST語法,例如:
String[] words = {"A", "X", "B", "Y"};
String[] newWords = Arrays.copyOf(words, words.length * 2);
java.util.Arrays
的copyOf()
方法可以接受任何型態的陣列,是因為其宣告上使用了泛型:
public static <T> T[] copyOf(T[] original, int newLength)
因此,編譯器可以從引數得知型態參數實際型態,強大的類型推斷對需要宣告變數型態的語言來說,有助於語法的簡化,尤其對Java在JDK8引入Lambda之後,會更加方便,對Lambda語法的可讀性有極大的助益,這之後還會再看到介紹。
java 静态方法上的泛型相关推荐
- Java基础篇:泛型与类型擦除
一.什么是泛型: 泛型的本质是 参数化类型,也就是说 将所操作的数据类型 指定为一个参数,在不创建新类的情况下,通过参数来指定所要操作的具体类型(类似于方法中的变量参数,此时类型也定义成参数形式),也 ...
- java实验泛型与容器总结_【Java心得总结三】Java泛型上——初识泛型
一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...
- 《重学Java系列》之 泛型(上)
不诗意的女程序媛不是好厨师~ [转载请注明出处,From李诗雨-https://blog.csdn.net/cjm2484836553/article/details/103278750] ✍ [篇外 ...
- Java这个高级特性-泛型,很多人还没用过!
点击关注公众号,Java干货及时送达 泛型是 Java 的高级特性之一,如果想写出优雅而高扩展性的代码,或是想读得懂一些优秀的源码,泛型是绕不开的槛.本文介绍了什么是泛型.类型擦除的概念及其实现,最后 ...
- Java笔记05-Collection、泛型、迭代器
Java笔记05-Collection.泛型.迭代器 [Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 ...
- 声明方法java实际开发中泛型使用需要注意的一些问题
在写这篇文章之前,xxx已经写过了几篇关于改声明方法主题的文章,想要了解的朋友可以去翻一下之前的文章 1.Map<K,V> 声明的泛型类型必须是类,不能是基本类型.如果是基本类型将其写为对 ...
- java史上最全面试题(转载于骆昊)
2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...
- Java基础系列12: 泛型
Java基础系列12: 泛型 本文是作者的读书笔记和心得整理,部分内容来源于网络,如有侵权,请联系作者. 什么是泛型 直接看例子 List arrayList = new ArrayList(); a ...
- 小白学JAVA之十八——泛型
小白学JAVA之十八--泛型 一. 基本概念 通常情况下集合中可以存放不同类型的对象,是因为将所有对象都看做Object类型放入的,因此从集合中取出元素时也是Object类型,为了表达该元素真实的数据 ...
最新文章
- 第十六届智能汽车竞赛AI视觉组分赛区数据集发布
- 关于spring事务管理
- Linux下载安装一个源码包
- OS- -请求分页系统、请求分段系统和请求段页式系统(一)
- 【Elasticsearch】es fielddata 字段数据
- Python编程语言中获取操作系统进程信息的方法
- Eclipse运行慢
- html中div页面布局,前端入门篇(二):利用Div + CSS快速布局页面
- 万年历matlab算法,万年历算法(万年历算法和分析)
- 聊一聊数据分析师这个职业
- 年轻人逃离算法?更懂你的时尚推荐算法,你会拒绝吗?| FashionHack 专栏
- 新人上路,以菜鸟之名,对现在已学以及将来要学的进行一个简单的梳理,希望多多指教
- Qlik view 连接数据库
- 推荐系统 - 排序算法 - 神经网络:FNN 论文阅读
- Access-Control-Allow-Headers是什么?有什么作用?
- protege 简介
- 什么是爬电距离?宽爬电距离光耦为什么越来越受大家青睐?
- 奥运了,愿明天会更好
- minikube 安装 Kubernetes Dashboard 并集成 Heapster
- 哪里可以找到原版经济学人?为什么读经济学人?