java基础--泛型之泛型参数

冰花ぃ雪魄 冰花ぃ雪魄     2022-07-30     433

关键词:

泛型机制常用的参数有3个:

“?”代表任意类型。如果只指定了<?>,而没有extends,则默认是允许任意类。
extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类。
super关键字声明了类型的下界,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object
前提
Fruit是Apple和Orange的超类。
本章通过java代码逐一分析泛型参数的意义和区别
extends参数:
[java]  
public void extend(List<? extends Fruit> list, Fruit fruit){    
        Fruit now = list.get(0);    
        System.out.println("now==>" + now);  
    //    Apple a = list.get(0);  无法通过编译  
        Object o = list.get(0);   
        System.out.println(o);  
        // list.add(fruit); //这句话无法编译      
        // list.add(new Object());  // 无法通过编译  
        list.add(null);//这句可以编译,因为null没有类型信息    
    }   
在上面的例子中,可以明确从list中取得的记录一定是Fruit,但是无法确定是Apple,list除了传入null外,不能添加其他任何参数;分析原因前先看以下的例子:
[java] 
public void testExtendType(){  
    List<? extends Fruit> list = new ArrayList<Fruit>();  
    List<? extends Fruit> list2 = new ArrayList<Apple>();  
    List<? extends Fruit> list3 = new ArrayList<Orange>();  
    extend(list2, new Apple());  
}  
从以上代码可以看出:
extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类,List<? extends Fruit> 可以指向 ArrayList<Fruit>()、ArrayList<Apple>()、 ArrayList<Orange>()等。现在如果传入的参数list为new ArrayList<Apple>(),则此时你向此list中添加
Fruit,则肯定报错。而读取数据时,不管list是什么类型,读取的数据肯定都是Fruit,同时Fruit也是Object。
通过以上的分析,知道直接往继承extends中的列表中添加记录是不行的,那么如何向extends修饰的list中添加记录,可以使用泛型方法来达到目的:
[java]  
public <T extends Fruit> void extendType2(List<T> list, T date){    
        list.add(date);    
    }   
调用示例如下:
[java]  
public void testExtendType2(){    
        List<Apple> list = new ArrayList<Apple>();    
        extendType2(list,new Apple());    
    }  
super参数
super用的不多,只简单介绍一下。
[java]  
public void superType(List<? super Apple> list, Apple apple){    
        Object o = list.get(0);  
        System.out.println(o);  
    //  Apple a = list.get(0); // 不能编译  
          
     // Apple apple = list.get(0); // 不能编译    
        list.add(apple);  
//      list.add( new Object());  // 不能编译  
//      list.add( new Fruit());  // 不能编译  
    }    
在以上代码中,从list中读取的记录无法确定是任何类型(除Object),list除了添加Apple外,不能添加任何类型的对象(包括Object)。分析原因前先看以下代码:
[java]  
public void testSuperType(){    
    List<? super Apple> list = new ArrayList<Apple>();    
    List<? super Apple> list2 = new ArrayList<Fruit>();   
    superType(list2, new Apple());    
}  
super关键字声明了类型的下界,表示参数化的类型是所指定的类型,或者是此类型的父类型,直至Object。List<? super Apple > 可以引用  List<Apple>,也可以引用 List<Fruit>,所以无法保证list中都是Apple,但是可以保证,所有list引用的都是Apple的父类,所有向此列表中添 加Apple是没有问题的,而很显然你向List<Fruit>、List<Apple>中添加Object、Fruit对象, 肯定失败,只能够添加Apple。
?参数
“?”代表任意类型。?可以看做 ? extends Object 的缩写。
[java] 
public void wideCardType(List<?> list, Fruit fruit ){  
    Object o = list.get(0);  
    System.out.println(list.get(0));  
    //  list.add(fruit);  // 不能编译  
    //  list.add(new Object()); // 不能被编译  
}  
[java]  
public void testWideCardType(){  
        /** 
         * ? 可以看做 ? extends Object 的简化版 
         */  
        List<?> list = new ArrayList<Fruit>();  
        List<?> list2 = new ArrayList<Apple>();  
        List<?> list3 = new ArrayList<Object>();  
          
        wideCardType(list,new Fruit());  
    }  
List<? super Object> 可以引用  List<任何类型>,而Object是所有的对象的祖先,此list只能添加Object类型对象。
extends和super意义记忆的技巧
? extends A: ?继承A,?是A的子类,或者?是A本身
? super B:    ?是B的父类,或者?是B本身

泛型之泛型方法

要定义泛型方法,只需将泛型参数列表置于返回值之前packagetuple;/***泛型方法*当使用泛型类时,必须在创建对象实例的时候指定类型参数的值*而使用泛型方法的时候,通常不必指明参数类型,编译器会为我们找出具体的类型--->... 查看详情

java泛型之泛型通配符具体是啥作用?

看图,可以解释下为什么吗?Java中不允许嵌套泛型的内层通配符?匹配一个具体的类型,因为这可能破坏类型安全。这样做是可以的:List<?>list=newArrayList<Integer>();而这样做是不可以的:List<List<?>>list=newArrayList<List... 查看详情

java基础知识(java之泛型)

   什么是泛型?为什么要使用泛型?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的... 查看详情

java基础知识之泛型简单介绍(代码片段)

1、什么是java泛型?java泛型:英文名称是generics,泛型是jdk5引入的一个新特性,java泛型的本质就是参数化类型,就是所有的操作数据类型被指定为一个参数。对参数化类型进行操作的实体(例如类、接口... 查看详情

java基础知识之泛型简单介绍(代码片段)

1、什么是java泛型?java泛型:英文名称是generics,泛型是jdk5引入的一个新特性,java泛型的本质就是参数化类型,就是所有的操作数据类型被指定为一个参数。对参数化类型进行操作的实体(例如类、接口... 查看详情

java基础之泛型(代码片段)

泛型genericity格式:<自定义泛型无意义大写英文字母占位符>例:<T>Type<E>Element<K>Key<V>value泛型可以在方法,类,接口中使用泛型在方法中使用使用静态方法的泛型格式:publicstatic<T>返回值类型[自定义... 查看详情

java之泛型擦除

泛型擦除  在严格的泛型代码里,带泛型声明的类总应该带着类型参数。但为了与老的Java代码保持一致,也允许在使用带泛型声明的类时不指定类型参数。如果没有为这个泛型类指定泛型参数,则该类型参数被称作一个原始... 查看详情

java基础之泛型

泛型类容器类应该算得上最具重用性的类库之一。 publicclassContainer{ privateStringkey; privateStringvalue; publicContainer(Stringk,Stringv){ key=k; value=v; } publicStringgetKey(){&nbs 查看详情

java泛型之<t>

  这里不讲泛型的概念和基础知识,就单纯的就我的理解说一下泛型中的<T>一.<T>  下面的一段码就可以简单使用了<T>参数,注释就是对<T>的解释。packagexayd.hjj;importjava.util.ArrayList;importjava.util.List;classA{}classB... 查看详情

java重要技术(21)泛型之参数化类型的特点(续)

1.1. 参数化类型的特点2 类型参数不同但是存在继承关系的两个参数化类型,仍然不能混用。类型参数的继承关系不能推导出参数化类型具有继承关系。publicclassGenericParameterTest2{staticclassBase{}staticclassDerivedextendsBase{}staticclas... 查看详情

java重要技术(20)泛型之参数化类型的特点

1.1. 参数化类型的特点参数化类型有以下特点:(1)参数化类型和没有类型参数的原始类型在编译后没有本质区别。(2)类型参数不同的两个参数化类型,不能混用。 publicclassGenericParameterTest{//参数化类型T,可以为String,Integer... 查看详情

java基础之泛型的使用

为什么要使用泛型首先我们先来看一段演示代码,如下所示,1publicstaticvoidmain(String[]args){2Listlist=newArrayList();3list.add("abc");4list.add(123);5list.add(HashMap.class);67System.out.println(list.get(0));8}第2行,List里面的内容类型是Obj 查看详情

java重要技术(22)泛型之参数化类型的本质

1.1. 参数化类型的本质Java参数化类型相对于C++的参数化类型而言,有本质区别。前者只是编译器的类型检查的一种手段,而后者则是真正的不利于原始类型的新的类型。 publicclassGenericParameterTest3{staticclassHello{}staticclassWorld... 查看详情

java重要技术(24)泛型之使用反射访问参数化类型

 1.1. 用反射访问参数化类型 使用反射机制可以获取到一部分参数化类型有关的信息。publicclassGenericParameterTest5{staticclassBase{}staticclassGeneric<TextendsBase>{publicTwork(List<T>list){returnlist.get(0);}publ 查看详情

java泛型之类型擦除

类型擦除学过C++模板的,在使用Java泛型的时候,会感觉到有点不疑问,例如:(1)无法定义一个泛型数组、无法调用泛型参数对象中对应的方法(当然,通过extends关键字是可以做到,只是比较麻烦);(2)ArrayList<Integer>... 查看详情

java进阶之泛型

泛型的优点泛型类型可以提高可靠性和可读性泛型可以参数化类型泛型可以让我们在编译时而不是在运行时检测出错误泛型类或方法允许用户指定可以和这些类或方法一起工作的对象类型(相容的对象)泛型类ArrayList、泛型接口... 查看详情

typescript专题之泛型

泛型在其他很多语言中广泛地得到使用,如Java、C++、.Net、C#等。它是程序设计语言的一种风格或范式。允许我们在编写代码的时候使用一些以后才指定的类型,在实例化时作为参数指明这些类型。而不同语言对于泛型的实现是... 查看详情

2022-08-01java之泛型枚举多线程

(目录)一、泛型1.什么是泛型泛型是JavaSE5出现的新特性,泛型的本质是类型参数化或参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。2.泛型的意义一般的类和方法,只能使用具体... 查看详情