Java泛型(1)泛型基本概念 通配符? 上限extends 下限super

泛型方法

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。

如何使用泛型方法打印不同类型的元素

public class GenericMethod {
    // 泛型方法 print
    public static <E> void printArray(E input) {
        // 输出泛型元素
        System.out.printf("%s ", input);
    }

    public static void main(String args[]) {
        // 不同类型: Integer, Double 和 Character
        Integer intE = 1;
        Character charE = 'A';

        System.out.println("整型元素为:");
        printArray(intE); // 传递一个整型

        System.out.println("\n字符型元素为:");
        printArray(charE); // 传递一个字符型元素
    }
}

泛型类

  • 普通类的声明:
class NormalClass{
.....
}
  • 在类名后面添加了类型参数声明部分
class GenericClass<E>{
    private E ele;
    public E set(E e){
        this.ele=e;
    }
}

泛型通配符?

类型通配符一般是使用?代替具体的类型参数。例如 List<?> 在逻辑上是List,List.... 等所有List<具体类型实参>的父类。

有界的泛型类型

类型通配符上限extends

class clazz {
    //定义一个泛型方法
    public static <T extends Number> T extendsMethod(T x,T y){
        y=x;
        return y;
    }
    
    //测试泛型方法
    public static void testExtendsMethod(){
        Integer x=0;
        Double y=1.0;
        System.out.println(extendsMethod(x,y));
        
        String str1="a";
        Integer integer=1;
        System.out.println(extendsMethod(str1,integer));//报错
    }
}

extends 表示泛型T应该是Number的子类(Integer、Short、Long、Float、Double),也就是规定了T的上界

类型通配符下限super

如果把上述方法testExtendsMethod中的extends改成super,会报错Unexpected token,暂时没有找到原因

TOTO

下面是可以用的:
类型通配符下限通过形如 List<? super Number>来定义,表示类型只能接受Number及其三层父类类型,如 Object 类型的实例。

posted @ 2020-04-15 17:14  JohnTesla  阅读(507)  评论(0编辑  收藏  举报