文档章节

泛型

weslie
 weslie
发布于 2015/06/29 13:29
字数 1128
阅读 10
收藏 0

1、”泛型“这个术语的意思是:”适用于许多许多的类型“。

2、泛型。其中尖括号括起来的的是类型参数(可以由多个),它指定了这个容器实例可以保存的类型。(p217)

3、基本类型无法作为类型参数。

4、对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。

5、当使用泛型类时,必须在创建对象的时候指定类型参数的值,而使用泛型方法的时候,通常不必指明参数类型,因为编译器会为我们找出具体的类型,这称为类型参数推断。

要定义一个泛型方法,只需将泛型参数列表置于返回值之前,如下:

//泛型方法
public <T> void f(T x) {
	System.out.println(x.getClass().getName());
}

//泛型方法中出现的泛型必须在返回值前进行声明泛型类型,否则泛型方法中将无法使用该类型的泛型
public static <A, B, C, D> FourTuple<A, B, C, D> tuple(A a, B b, C c, D d) 
	return new FourTuple<A, B, C, D>(a, b, c, d);
}

//泛型类,泛型类只需要将泛型写在类名后即可
class GenericityClass <T> {
	
}
6、在泛型代码内部,无法获得任何有关泛型参数类型的信息。因此,你可以知道诸如类型参数标识符和泛型类型边界这边类的信息——你却无法知道用来创建某个特定实例的实际的类型参数。Java泛型是使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就是你在使用一个对象。因此List<String>和List<Integer>在运行时事实上是相同的类型。这两种形式都被擦除成它们的“原生类型”,即List。(p373)

7、只有当你希望代码使用的类型参数比某个具体类型(以及它的所有子类型)更加“泛化”时——也就是说,当你希望代码能够跨多个类工作时,使用泛型才有所帮助。(p375)

8、泛型类型只有在静态类型检查期间才出现,在此之后,程序中的所有泛型类型都将被擦除,替换为它们的非泛型上界。例如,诸如List<T>这样的类型注解将被擦除为List,而普通的类型变量在未指定边界的情况下将被擦除为Object

9、因为擦除在方法体中移除了类型信息,所以在运行时的问题就是边界:即对象进入和离开方法的地方,这些正是编译器在编译期执行类型检查并插入转型代码的地点。(p378)

10、不能创建泛型数组,一般的解决方案是在任何想要创建泛型数组的地方都使用ArrayList。(p383)

       List<T> array = new ArrayList<T>();

       成功创建泛型数组的唯一方式就是创建一个被擦除类型的新数组,然后对其进行转型。

public class GenericArrayWithTypeToken<T> {
	private T[] array;

	@SuppressWarnings("unchecked")
	public GenericArrayWithTypeToken(Class<T> type, int sz) {
		array = (T[]) Array.newInstance(type, sz);
	}

	public void put(int index, T item) {
		array[index] = item;
	}

	public T get(int index) {
		return array[index];
	}

	// Expose the underlying representation:
	public T[] rep() {
		return array;
	}

	public static void main(String[] args) {
		GenericArrayWithTypeToken<Integer> gai = new GenericArrayWithTypeToken<Integer>(Integer.class, 10);
		// This now works:
		Integer[] ia = gai.rep();
		System.out.println(Arrays.toString(ia));
	}
}

11、边界

因为擦除移除了类型信息,所以,可以用无界泛型参数调用的方法只是那些可以用Object调用的方法。但是如果能够将这个参数限制为某个类型子集,那么你就可以用这些类型子集来调用方法。为了执行这种限制,Java泛型重用了extends关键字。要理解extends关键字在泛型边界上下文环境中和普通情况下所具有的意义是完全不同的。





//Dog是Pet的一个子类
//<? extends Pet>这种写法,可以不用强制转换
public static Map<Person, List<? extends Pet>> petPeople = new HashMap<Person, List<? extends Pet>>();
petPeople.put(new Person(), Arrays.asList(new Dog()));
	
public static Map<Person, List<Pet>> petPeople = new HashMap<Person, List<Pet>>();
petPeople.put(new Person(), Arrays.asList(new Dog()));//编译通不过
petPeople.put(new Person(), Arrays.asList((Pet)new Dog()));//必须进行强制转换

3、学习泛型的几个问题:

   (1)Java泛型的局限是什么?

   (2)Java泛型的边界在哪里?

© 著作权归作者所有

上一篇: 关键字this
下一篇: Thinking In Java
weslie
粉丝 1
博文 51
码字总数 80088
作品 0
虹口
程序员
私信 提问
java泛型操作复习,以及讲解在android中使用的场景

android使用泛型的地方很多,比如集成自BaseAdapter实现封装的Adapter,对常用操作进行封装,但是需要对传进来的数据进行处理,此时就使用到泛型,示例如下: public abstract class EasyAdap...

青莲居士
2016/01/13
947
0
Java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。 本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1 概述 泛型在j...

hensemlee
2018/09/23
249
0
swift4.1 系统学习二十一 泛型

/* 泛型 本节我们一起学习泛型这一概念。在项目中,多次用到了泛型,但是对它的理解总是不够透彻,运用也不熟练。 趁此机会,好好熟悉一下。 什么是泛型? 比如我们要实现一种算法,例如搜索...

小曼Study
2018/10/29
0
0
08-利用思维导图梳理JavaSE-泛型

08-利用思维导图梳理JavaSE-泛型 主要内容 1.泛型的基本概念 1.1.定义 1.2.使用前提 1.3.使用泛型的好处 2.泛型的使用 2.1.泛型类定义 2.2.泛型对象定义 2.3.泛型中的构造方法 2.4.泛型方法的...

飞鱼说编程
2018/09/20
39
0
TypeScript基础入门 - 泛型 - 泛型类型

转载 TypeScript基础入门 - 泛型 - 泛型类型 项目实践仓库 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接运行看到输出的结果。 后面自己在练习的时候可以这样使用 ...

durban
2018/08/28
7
0

没有更多内容

加载失败,请刷新页面

加载更多

83、Mybatis和Hibernate重要区别

Mybatis;入门简单,程序容易上手开发,节省开发成本。Mybatis需要程序猿自己编写sql语句,是一个不完全的ORM框架,对sql修改和优化非常容易实现。 Mybatis适合开发需求变更频繁的系统,比如...

lianbang_W
今天
5
0
设计模式之状态模式

定义 Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时允许其改变行为,这个对象看起来像改...

陈年之后是青葱
今天
6
0
Python常用模块之os.path

os.path.abspath(path) 输入相对路径,返回绝对路径 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32Type "copyright", "credits" or "lic......

松鼠大帝
今天
11
0
001. JAVA程序运行原理分析

1. 先来看看JVM运行时数据区的结构 线程独占: 每个线程都有它独立的空间,随线程生命周期而创建和销毁。 线程共享: 所有线程能访问这块内存数据,随虚拟机GC 而创建和销毁。 JVM 用来存储加载...

紫穹
今天
24
0
SDN核心思想&Mininet

2.1ONF定义的SDN基本架构: 应用层:实现网络流量的灵活控制,使网络作为管道智能 控制层:网络虚拟化实现方式,核心技术OpenFlow 转发层新型创新架构,实现网络设备控制与转发分离 2与3之间...

Firefly-
昨天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部