Java泛型相关总结(上)

最近在看《Java核心技术》泛型相关的部分,总结下。

泛型程序设计是什么?

泛型编程(generic programming)是计算机编程中的一种风格,类型通过参数指定。意味着编写的代码可以被不同类型的对象所使用。

类型参数(type parameters),指示类型。ArrayList用类型参数来指示包含元素的类型。使程序有更好的可读性和安全性。

解决什么问题?

使代码具有更好的可读性和安全性。

如何用

泛型类(generic class)具有一个或多个类型参数的类。如下所示,用具体的类型替换类型变量就可以实例化类型参数,Pair<String>。

 1 public class Pair<T> {
 2     private T first;
 3     private T second;
 4
 5     public Pair() {
 6         first = null;
 7         second = null;
 8     }
 9
10     public Pair(T first, T second) {
11         this.first = first;
12         this.second = second;
13     }
14
15     public T getFirst() {
16         return first;
17     }
18
19     public void setFirst(T first) {
20         this.first = first;
21     }
22 }

泛型方法(generic method)。泛型方法可以定义在普通类中,也可以定义到泛型类中。

在普通类定义泛型方法

class ArrayAlg {
    public static <T> T getMiddle(T... a) {
        return a[a.length/2];
    }
}

调用泛型方法,<String>大部分情况下可不写。

ArrayAlg.<String>getMiddle("John", "Q", "Public");

对于编译器无法确定参数类型会给出错误报告,如下所示。编译器会将参数打包成1个Double,2个Integer,并寻找其共同的超类,且找到两个Number和Comparable,会报错。

ArrayAlg.getMiddle(3.14, 1729, 0);

对类或方法的类型变量加以限定。

class ArrayAlg {
    public static <T extends Comparable> T min(T... a) {
    }
}

可以有多个限定,用&连接,但限定中至多有一个类,且必须是限定列表中的第一个。

T extends Comparable & Serializable

虚拟机没有泛型类型对象,所有对象都属于普通类。编译器会擦除(erased)类型变量,并替换为限定类型(如果没有限定类型,使用Object),使之成为原始类型(raw type)。Pair<T>的原始类型如下:

public class Pair {
    private Object first;
    private Object second;
}

关于Java泛型转换的事实:
虚拟机中没有泛型,只有普通的类和方法
所有的类型参数都用它们的限定类型替换
桥方法被合成来保持多态
为保持类型安全性,必要时插入强制类型转换

原文地址:https://www.cnblogs.com/minguo/p/10576060.html

时间: 2024-11-10 09:22:32

Java泛型相关总结(上)的相关文章

Java 泛型相关整理

1. 概述 Java 泛型(generics)是 JDK 5 中引入的一个新特性,泛型提供了 编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型,即 参数化类型.将类型由原来的具体的类型(类似于方法的变量参数,该变量定义了具体的类型),也定义成参数形式(可以称之为类型形参),然后在使用/调用时再传入具体的类型(类型实参). 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型). 在泛型使用过程中,操作的数据类型被指定为一个参

java泛型中的上、下界通配符

java泛型中,通配符?表示未知类型,等同于<? extends Object>,<? extends T>是上边界限定通配符,<? super T>是下边界限定通配符. 一.区别 在一个list中,上下界通配符能够存放和读取的对象类型如下图所示: 二.原则 上下界通配符的使用应当遵循PECS原则:Producer Extends,Consumer Super. 限定通配符总是包括自己 上界类型通配符:add方法受限 下界类型通配符:get方法受限 如果你想从一个数据类

Java泛型相关

字节码对象的三种获取方式 以String为例 Class<? extends String> strCls = "".getClass(); Class<String> strCls2 = String.class; Class strCls3 = Class.forName("java.lang.String"); System.out.println(strCls.equals(strCls2)); // true System.out.

Java泛型指哪些

以下文章的内容主要是围绕(Java泛型:类型檫除.模板和泛型传递)这个内容来讲述的,一起看下小编带来的java的这三个泛型简介. Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JDK 5中的新集合类框架中.对于泛型概念的引入,开发社区的观点是褒贬不一.从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编

2.java泛型基础

Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JDK 5中的新集合类框架中.对于泛型概念的引入,开发社区的观点是褒贬不一.从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误.而从不好的地方来说,为了保证与旧有版本的兼容性,Java泛型的实现上存在着一些不够优雅的地

你了解泛型通配符与上下界吗?

在进入主题之前, 我们先简单说一下 Java 的泛型(generics).它是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JDK 5中的新集合类框架中. 今天我们主要说如下内容: 泛型的背景 通配符以及上下界 泛型及通配符的使用场景 为什么使用泛型及背后的问题?我们来看一下官方的说法: Stronger type checks at compile time.A Java com

Java泛型的实现:原理与问题

很久没写博客了,因为项目和一些个人原因.最近复习找工作,看书+回想项目后有一些心得,加上博客停更这么长时间以来的积累,很是有些东西可写.从今儿开始,慢慢把之前积累的东西补上来,方便以后查漏补缺. 先从最近的开始.昨天看到Java泛型相关的内容,有些疑惑,查资料之后发现这部分很有些有意思的东西,比如类型擦除带来的重写问题等等,一并记录在这篇文章里. 1. 泛型定义 看了很多泛型的解释百度百科,解释1,解释2,都不是我想要的"以用为本"答案(没讲明白泛型的作用或者说设计目的),这里我自己总

Richard Warburton与Raoul-Gabriel Urma在Devoxx UK 2015上回顾Java泛型历史

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/06/angular-2-react-native-roadmap Richard与Raoul向广大开发者提供关于Java 8的培训课程.近日,二人在Devoxx UK 2015上共同进行了一场演讲,回顾了Java泛型的起源与动机.介绍了目前一些不为人知的特性,同时对Java 10进行了展望.该演讲由3个精彩的部分构成:泛型的过去.现在与未来. 过去 正如Richard与Ra

Java集合相关面试问题和答案

Java集合相关面试问题和答案 面试试题 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实现.集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类.