Java中的泛型

快扶我去看书.jpg

由浅入深,没时间解释了,快上车,fuck car!!!

Java中的泛型,相信很多人在开发中都用到,像下面的

public  class  Test <T> {
    private T  t;
    private  <T> T getData() {
    };
    private interface ITest <T> {
        T getData();
        T getDatas(T a);
    }
}

是不是很熟悉,很好,觉得熟悉就对了,那下面这个呢,涉及到了泛型的限制,通配符之类的,是不是很眼熟呢~。

//通配符(还有super)
public void  method4(Person<? extends Fruit> p) {
}

public  class  Test <T exstends Serializable> {}

//正确
public  class  Test <T exstends  ArrayList&Serializable> {}
//下个却是错的,如果有多个,类要放在第一(ArrayList),接口放在后面(Serializable),语法限制。。。
public  class  Test <T exstends  Serializable&ArrayList> {}

上面的错误的原因,请看下图:


image.png

......

唠嗑了下曾经碰到过的,那么,开始吧,提出问题。

1. 什么是泛型
2. 为什么要用泛型
3. 泛型的使用
4. 限定类型变量
5. 泛型使用中的局限性
6. 泛型中的通配符类型
7. 虚拟机是如何实现泛型的

问题提出来了,喝瓶阔落压压惊。


image.png
  1. 什么是泛型

可以这么理解:参数化类型或者类型参数化。什么意思呢?用过方法吧,方法里面传的参数,举个例子:

//方法1
public  int getData(int a) {
}
//方法2
public <T>  T  getData(T a) {
}

方法1把类型参数化,变成方法2,就不再局限于该方法的参数类型只能是int,你可以是String,double等之类的。

  1. 为什么要用泛型
1.多种数据类型使用相同的代码。
2.使用泛型,在编码过程中指定数据类型,不需要强制转换。

3.泛型的使用
泛型主要用在类,接口,方法。

泛型类

public class  Fruit{
}
public class Apple extends Fruit {
}

public class Person <T> {
}
//派生类
public  class  Demo  <T>  extends Person <T> {
  private List<T> list;
}

 泛型类是可以继承或者扩展其他泛型类的,正确的写法是:
 Person<Apple> p1 = new Demo<Apple>(); //里面的类型Apple不能换  成Fruit 
注意: 
  Person<Fruit> p1 = new Person<>();
  Person<Apple> p2 = new Person<>();
  p1跟p2没有继承关系,如何证明呢,看下面:
  Person<Apple> p1 = new Person<Fruit>();
  上面代码会报错了~
 

泛型接口

public interface CallBack <T> {
  void callBack(T a);
}
//接口实现
public class ImpCallBack  <T> implements CallBack <T> {
...
}
或者具体某个
public class ImpCallBack  implements CallBack <String> {
...
}

泛型方法

//泛型方法
public <T> T  methodTest(T t) {
...
}

//注意:下面的method1并不是泛型方法,他只是引用了Demo中的泛型
public  class  Demo  <T>  extends Person <T> {
  public void method1(Demo<T>  demo) {
    ...
  }
}

4.限定类型变量

泛型的限定类型变量,就是限定可以传递的类型。
举个例子(这里就拿  泛型方法做例子, because,泛型类,泛型接口与泛型方法类似。)
public class Person{
}
public class Boy extends Person{
}

public class Aa{
}

此时,我这里有个方法
public <T extends Person> void method2( T t) {
  ...
}
如果需要调用这个方法,只能传递Person或者Person的子类:
  method2(new Boy());
  method2(new Person());
  method2(new Aa());    //错误,这个不行
如果传递的是别的对象,sorry,不行

5.泛型使用中的局限性

不能实例化类型变量
public class Person <T>{
  private T t = new T();
}
上面这情况是不阔以的,语法不允许(报错:type parameter "T" cannot be instantiated directly)
静态域或者静态方法是不能引用类型变量
public class Person <T>{
  private static void method3(T t){
  ...
  }
 private static <T> void method4(T t){
  ...
  }

}
 //注意
 上面的method3写法是不可以,原因:静态方法的执行比对象的创建 
 要早, 然而new Person<String>()的时候,才知道T的类型。

 当然了,静态方法本身是泛型方法就可以。看method4()方法。
泛型里面不能是基本数据类型
public class Person <T>{
}
使用: new Person<int>() ,是错误的,int需要装箱后放进去。
也就是说,只能是对象,不能是基本数据类型
泛型是不能用instanceof关键字的
举个例子
public class Person <T>{
}
public static void main(String[] args) {
    Person <T> person;
    if(person instanceof  Person <T>) {
    }
//是不允许的,不支持
}
泛型类不能继承Exception
//下面这样写,直接就给你飘红了
public class Person<T> extends Exception {
}

看图


image.png
泛型其他有趣的限制
Person<Long>[]  person;  //定义可以,没问题,but
person = new Person<Long>[5];  //初始化,对不起,不行~

不要问为什么。。。语法限制

6.泛型中的通配符类型
我们来看个例子

//普通类
public class Food {
}
public class  Fruit extends Food{ 
}
public class Apple extends Fruit {
}
//泛型类
public class Person <T> {
}
....
public void  method3(Person<Fruit> p) {
}
//使用了通配符的
public void  method4(Person<? extends Fruit> p) {
}
public void  method5(Person<? super  Fruit> p) {
}
public static void main(String[] arg) {
   Person<Food> p0 = new Person<>();
   Person<Fruit> p1 = new Person<>();
   Person<Apple> p2 = new Person<>();
  //方法调用
  method3(p1); //这个毫无疑问,是可以的
  method3(p2); // 不可以!!! 
  //这个时候就要使用通配符了
  method4(p1); .// you can
  method4(p2); // 哎,这个也可以了
  method4(p0); //这个不行,看下面说明
  //说明:通配符 extends 限制了上界,比如上面的,上届就是Fruit,
  //只要是派生自Friut或者本身,都可以,Food就不行了(也就是说,只要是 Friut的子类都可以)

  //还没完事呢,通配符除了extends ,还有 super,
  //用法刚好跟extends相反,看method5,只要是 Fruit的超(父)类或者其本身,都可以。
}

7.虚拟机是如何实现泛型的
实不相瞒,进行了泛型擦除。什么意思呢,我举个例子

public class Person<T> {
  private T t;
}
上面的类泛型擦除后,会是下面这个:
public class Person<T> {
  private Object t;
}
继续看
public class Person<T extends ArrayList&Comparable> {
  private T t;
  public void test(){
     // t.compareTo()
  }
}
擦除后这样的:
public class Person<T extends ArrayList&Comparable> {
  private ArrayList t;
  public void test(){
     // (Comparable)t.compareTo()
  }
}
开头就提出来了,如果有继承的,必须放在第一(ArrayList放在Comparable前面),
类只能有一个(因为在java里面,是单继承的),接口可以多个。对于后面的Comparable,什么时候体现呢?
当你在某个方法用到了Comparable接口的时候,编译器会插入一个强制转型的代码,看test()方法。
感兴趣的可以看编译后的.class文件。

over,记录下。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,100评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,862评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,993评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,309评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,303评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,421评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,830评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,501评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,689评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,506评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,564评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,286评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,826评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,875评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,114评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,705评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,269评论 2 341

推荐阅读更多精彩内容