泛型
- Why:为什么需要泛型
- What:泛型是什么;
- How:泛型怎么实现
- When:泛型什么时候使用
- Where:泛型在哪里使用
- Other:使用泛型会带来什么问题?
- 什么时候把类型传给类型形参
wiki
- Java深度历险(五)——Java泛型
- java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
- https://nofluffjuststuff.com/magazine/2016/09/time_to_really_learn_generics_a_java_8_perspective
What:泛型是什么?
- 泛型的定义
泛型的使用
- 泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。
具体示例
package GenericsTest;
public class GenericsClass<T> {
T var;
public GenericsClass(T t)
{
var = t;
}
public void doSomethins()
{
System.out.println(this.var);
}
}
- 泛型的类型参数只能是类类型,不能是简单类型。
不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错。
if(ex_num instanceof Generic<Number>){ }
泛型类的实现原理
package GenericsTest;
public class GenericsClass<T extends String> {
T var;
public GenericsClass(T t)
{
var = t;
}
public void doSomethins()
{
System.out.println(this.var);
}
}
编译代码
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: GenericsClass.java
package GenericsTest;
import java.io.PrintStream;
public class GenericsClass
{
public GenericsClass(String s)
{
var = s;
}
public void doSomethins()
{
System.out.println(var);
}
String var;
}
从中可以看出泛型类是将类型参数转化为类型的上界,示例中转化为String
,如果没有指定上界,则转化为Object
什么时候泛型形参变为实参
泛型的类型擦除(type erasure)
- 使用类型时