靜態方法上的泛型

泛型也可以僅定義在靜態方法上,舉例而言,在 定義與使用泛型 中自定義過支援泛型的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心得总结三】Java泛型上——初识泛型

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

  2. 【Java学习笔记】泛型

    泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...

  3. JAVA提高六:泛型

    在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将方法的参数类型设置为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数,这样的方法将会更具有通用性.此外,如果将方法参数声明为接口,将 ...

  4. Java Collections API和泛型

    Java Collections API和泛型 数据结构和算法 学会一门编程语言,你可以写出一些可以工作的代码用计算机来解决一些问题,然而想要优雅而高效的解决问题,就要学习数据结构和算法了.当然对数据 ...

  5. Java基础 -- 深入理解泛型

    一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大. 而泛型很好的解决了这个问题,这也是Java SE5的重大 ...

  6. JAVA基础--JAVA 集合框架(泛型、file类)16

    一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...

  7. JAVA基础--JAVA 集合框架(泛型、file类)

    一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...

  8. Day 8:方法上自定义泛型、类上、接口上、泛型的上下限

    泛型 泛型是jdk1.5使用的新特性  泛型的好处:   1. 将运行时的异常提前至了编译时    2. 避免了无谓的强制类型转换 泛型在集合中的常见应用:    ArrayList<Strin ...

  9. 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的

    数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...

随机推荐

  1. Flask: socket.error: [Errno 48] Address already in use 问题

    参考: Mac OSX 解决socket.error: [Errno 48] Address already in use问题 Mac OS X中解决socket.error: [Errno 48] ...

  2. Python学习札记(四十一) IO 1

    参考:IO NOTE A.Pre 1.IO在计算机中指Input/Output,也就是输入和输出. 2.IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但 ...

  3. Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息

    1. 加载大图片到内存,从gallery获取图片 android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常, 需要将图片等比例缩小到适合手机屏幕分辨率, 再加载. 从gallery ...

  4. 重器--biomart

    biomart 重器 biomaRt工具包的作用在于它可以轻松地完成的在多个生物学数据库上繁琐地检索,获取相关数据在不同数据库间的关联.

  5. SDK manager 中 Done loading packages 问题

    1.在选项栏中点击tools,选择Optons… 在弹出的设置窗口中勾选Force https://…sources to be fetched using http://… 然后点击Close 4. ...

  6. SQL Server2012创建约束图解

            SQLServer中有五种约束:Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束  1 . Primary Key 约束 在 ...

  7. 【Python】实现将Excel编写的用例上传到testlink指定用例集

    背景 百科上说TestLink 是基于web的测试用例管理系统,主要功能是测试用例的创建.管理和执行,并且还提供了一些简单的统计功能.其他的信息可以参照他们的官网http://www.testlink ...

  8. 获取和设置HTML标签中的数据

  9. Linux网络编程--洪水攻击详解

    洪水攻击详解 ①注解:洪水攻击(FLOOD ATTACK)是指利用计算机网络技术向目标主机发送大量无用的数据报文,使得目标主机忙于处理无用的数据报文而无法提供正常服务的网络行为. 主要原理:利用了网络 ...

  10. 2243: [SDOI2011]染色 树链剖分+线段树染色

    给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组 ...