1.什么是泛型?
泛型就是可适用于很多的类,它实现了参数化类型type parameter的概念,参数化类型指可使用多种类型。
多态是一种泛化机制。
例如方法 A(Base b){}//Base是一个基类
这样方法A就可以接受从这个基类Base的任何子类作为参数。方法的参数也可以是一个接口,但是由于类的单继承体系和接口的约束(
An interface still requires that your code works with that particular interface.
),不能实现将代码应用于不明确的类型,无法做到松耦合。
2.什么时候用到泛型?怎么用?
1)创造容器类。Create container classes.
There are some cases where you want a container to hold multiple types of objects, but typically you only put one type of object into a container. One of the primary motivations for generics is to specify what type of object a container holds, and to have that specification backed up by the compiler.
有些情况下你想用一个容器来持有多种对象,但容器通常只能存储一种对象。泛型最主要的一个目的是说明一个容器能持有什么类型的对象,而且由编译器来保证准确性。
所以我们可以暂时不指定类型,稍后再决定具体类型。使用type parameter类型参数,用<>尖括号括住,放在类名后面,等到使用这个类时再用一个实际的类型来替换,例子如下,
public class Holder3<T> { private T a; public Holder3(T a) { this.a = a; } public void set(T a) { this.a = a; } public T get() { return a; } public static void main(String[] args) {
Holder3<Automobile> h3 = new Holder3<Automobile>(new Automobile());
Automobile a = h3.get(); // No cast needed // h3.set("Not an Automobile"); // Error // h3.set(1); // Error
}
} ///:~
20180124未完待续...
转自维基百科中Java泛型
https://zh.wikipedia.org/wiki/%E6%B3%9B%E5%9E%8B
Java 的泛型[编辑]
Java 泛型的参数只可以代表类,不能代表个别对象。由于Java泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型,而且无法直接使用基本值类型作为泛型类型参数。Java编译程序在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。
由于运行时会消除泛型的对象实例类型信息等缺陷经常被人詬病,Java及JVM的开发方面也尝试解决这个问题,例如Java通过在生成字节码时添加类型推导辅助信息,从而可以通过反射接口获得部分泛型信息。通过改进泛型在JVM的实现,使其支持基本值类型泛型和直接获得泛型信息等。
Java允許對個別泛型的類型參數進行約束,包括以下兩種形式[2](假設T
是泛型的類型參數,C
是一般类、泛類,或是泛型的類型參數):
T
实现接口I
。T
是C
,或繼承自C
。