白话说泛型

java泛型

  1. 什么是泛型?

  2. 泛型到底是干嘛的。

  3. 使用泛型的好处。

  4. 为什么使用泛型。

  5. 泛型的基本用法。

  6. 泛型的常见错误。

什么是泛型:

什么是泛型呢?刚开始接触的时候我也还是不太明白,用官方的话他叫:“变量类型的参数化”,他是JDK1.5中一个重要的特性。通过引入泛型我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。

自己对泛型的理解:

人都是懒惰的,总想着一劳永逸,我们用类和方法,只能使用具体的类型,要么是基本类型,要么就是自己定义的类,这样代码的通用性很差,所以我们的前辈写出了泛型。所以说:“懒人”成就了科技,让我们的生活更加的智能化。

泛型到底是干嘛的:

泛型最多且最典型的是用于集合中。

在没有泛型的时候我们在集合存入的都是Object类型的数据,需要进行强制转换转换我们需要的类型。

比如:

import java.util.List;

import java.util.LinkedList;

public class Test {

public static void main(String[] args) {

List list=new LinkedList();

list.add(111);

boolean boo= list.get(0)>2000;注1;

}

}

这段代码他会报错1:The operator > is undefined for the argument type(s) Object, int(操作符>是未定义的参数类型(s)对象,int)。现在集合中的0下标值为Object类型的,即使我们对他进行了强转的处理,他会不进行报错,但一样会存在很多异常隐患,且集合中可以存储很多个的类型,他做不到规范的读取使用,这个时候就需要用到我们的泛型了。

package fanxingboke;

import java.util.List;

import java.util.LinkedList;

public class Test {

public static void main(String[] args) {

List <Integer>list=new LinkedList<Integer>();

list.add(111);

boolean boo= (int)list.get(0)>2000;

System.out.println(boo);

}

}

如上代码,咱们在集合类后面加上<>尖括号里面写上数据类型,前后尖括号的值必须得一致。这样咱们就能准确的规范咱们这个集合需要写上什么的数据,例如我上面泛型里规定的是int类型,这个集合只能存储int类型的数据,如果传入不是泛型规定的类型,这段代码就会报错,你就能及时解决代码的错误,就不会存在安全隐患。

这个咱就可以理解为方法的传参,声明实例的时候就给泛型进行了规定,只能为咱们规定的类型。

泛型也可以继承如:

父类:

public class Parent<T1,T2>

{

    private T1 variable1;

    private T2 variable2;

    

    public T1 getvariable1()

    {

        return variable1;

    }

    public void setFoo1(T1 variable1)

    {

        this.variable1= variable1;

    }

    public T2 getvariable2()

    {

        return variable2;

    }

    public void setFoo2(T2 variable2)

    {

        this.variable2= variable2;

    }    

 

}

子类:

public class Child<T1, T2, T3> extends Parent<T1, T2>

{

    private T3 variable3;

 

    public T3 getvariable3()

    {

        return variable3;

    }

 

    public void setFoo3(T3 variable3)

    {

        this.variable3= variable3;

    }

    

}

泛型也可以去实现接口,这个我都不细说了细说就有偏题跑到接口了,给大家留点想象的空间。

泛型的上限和下限:

设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类:

声明对象:类名<?extends 类> 对象名

定义类:类名<泛型标签 extends 类>{}

设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类:

声明对象:类名<?super 类> 对象名称

定义类:类名<泛型标签 extends类>{}

向下引用:

package fanxingboke;

 

import java.util.List;

import java.util.LinkedList;

 

public class Test {

public static void main(String[] args) {

F<? extends Object> f = new F<String>();// 这是声明实例,向下引用声明的时候<>里必须为extends他后面跟的必须是父级,后面泛型规定尖括号里必须为他的子类,也包括他本身。

 

f.D("这是向下引用");

}

}

 

class F<T> {//定义一个泛型类。

public void D(Object object) {

System.out.println(object);

}

}

向上引用:

package fanxingboke;

 

import java.util.List;

import java.util.LinkedList;

 

public class Test {

public static void main(String[] args) {

F<? super String> f = new F<Object>();// 这是声明实例,向上引用声明的时候<>里必须为关键字super他后面跟的必须是子级,后面泛型规定尖括号里必须为他的父类,也包括他本身。

 

f.D("这是向上引用");

}

}

 

class F<T> {//定义一个泛型类。

public void D(Object object) {

System.out.println(object);

}

 手动滑稽 - --  - - --  - - -- -

 

```1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
泛型在使用中还有一些规则和限制:
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如。习惯上成为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(Java.lang.String);



--------------------- 
作者:黑夜的黑马 
来源:CSDN 
原文:https://blog.csdn.net/luxiangyan1923/article/details/54692572 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_43165760/article/details/86249183