2020-06-29泛型

作者: 智障猿 | 来源:发表于2020-06-29 09:27 被阅读0次

泛型

  • 概述
    将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型。
  • 定义格式
    <类型>:指定一种类型的格式。
    <类型1,类型2>:定义多种类型的格式。
  • 泛型的好处
    ①把运行时期的问题提前到编译期间
    ②避免了强制类型转换

泛型类

  • 泛型类定义格式
    ①修饰符 class 类名 <类型>{}
    ②public class Teacher <T>{}:此处的T可以随便写为任意表示,常见为T,E,K,V

泛型方法

  • 泛型方法的定义格式
    ①修饰符 <类型> 返回值类型 方法名(类型 变量名){}
    ②public<T> void show(T t){}

泛型接口

  • 泛型接口定义格式
    ①修饰符 interface 接口名<类型>{}
    ②public interface Run<T>{}
  • 使用
//接口
public interface Teach<T> {
    void teach(T t);
}
//接口实现类
public class TeachImpl<T> implements Teach<T> {
   //重写接口中的泛型方法
    @Override
    public void teach(T t) {
    }
}

类型通配符

当声明一个方法时,某个形参的类型是一个泛型类或泛型接口类型,但是在声明方法时,又不确定该泛型实际类型,可以考虑使用类型通配符。

  • <?>
  • List<?>:表示 元素类型未知的List,它的元素可以匹配任何类型。
  • 因为程序无法确认List<?>集合中元素的类型,所以不能向其中添加对象
  • 类型通配符的上线:<? extends 类型>
  • 类型通配符的下线:<? super 类型>
  1. 方式一:声明一个泛型方法
public static void test1(List<Object> c){
        for (int i = 0; i < c.size(); i++) {
            System.out.println(c.get(i));
        }
    }

这样的形参太局限了,只能传入 List<Object> 类型的实参。

  1. 方式二:声明一个泛型方法
public static <T> void test2(List<T> c){
        for (int i = 0; i < c.size(); i++) {
            System.out.println(c.get(i));
        }
    }

该方法需要声明泛型形参T。

  1. 方式三:使用类型通配符
public static void test3(List<?> c){
        for (int i = 0; i < c.size(); i++) {
            System.out.println(c.get(i));
        }
    }

那么方式二的泛型方法 test2() 和方式三的 test3() 使用类型通配符有什么区别?

test3方法带通配符的List仅表示它可以接受指定了任意泛型实参的List,并不能把元素加入其中,例如如下代码将会引起编译错误:

 public static void test(List<?> c, String str){
        c.add(str);
 }

因为我们不知道上面程序中c集合里元素的类型,所以不能向其中添加对象,除了null对象,因为它是所有引用数据类型的实例。

test2方法带泛型的List,表示该集合的元素类型是T,因此允许T系列的对象加入其中,例如如下代码是可行的:

public static <T> void test(List<T> c, T t){
    c.add(t);    
}

即如果不涉及添加元素到带泛型的集合中,那么两种方式都可以,如果涉及到添加元素到带泛型的集合中,使用类型通配符<?>的不支持。

相关文章

  • 2020-06-29泛型

    泛型 概述将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型。 定义格式<类型>:指定一种类型的格式...

  • 泛型 & 注解 & Log4J日志组件

    掌握的知识 : 基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例) 泛型 概述 : 泛型...

  • 【泛型】通配符与嵌套

    上一篇 【泛型】泛型的作用与定义 1 泛型分类 泛型可以分成泛型类、泛型方法和泛型接口 1.1 泛型类 一个泛型类...

  • 泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法 泛型类 泛型接口 泛型通配符 泛型方法 静态方法与...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • 探秘 Java 中的泛型(Generic)

    本文包括:JDK5之前集合对象使用问题泛型的出现泛型应用泛型典型应用自定义泛型——泛型方法自定义泛型——泛型类泛型...

  • Web笔记-基础加强

    泛型高级应用 自定义泛型方法 自定义泛型类 泛型通配符? 泛型的上下限 泛型的定义者和泛型的使用者 泛型的定义者:...

  • 重走安卓进阶路——泛型

    ps.原来的标题 为什么我们需要泛型? 泛型类、泛型接口和泛型方法(泛型类和泛型接口的定义与泛型方法辨析); 如何...

  • Kotlin泛型的高级特性(六)

    泛型的高级特性1、泛型实化2、泛型协变3、泛型逆变 泛型实化 在Java中(JDK1.5之后),泛型功能是通过泛型...

  • Java 19-5.1泛型

    泛型类定义泛型类可以规定传入对象 泛型类 和泛型方法 泛型接口 如果实现类也无法确定泛型 可以在继承类中确定泛型:

网友评论

    本文标题:2020-06-29泛型

    本文链接:https://www.haomeiwen.com/subject/utwnfktx.html