精华内容
下载资源
问答
  • 范型通配符和限定

    2019-10-20 17:12:29
    当使用范型类或者接口时,传递的具体的类型不确定,可以通过通配符表示. 如果想要对被使用的集合中元素类型进行限定,使用范型的限定 //Person是要被使用的集合的父类 上限: ? extends E //接收E的子类 下限: ? ...
    private static void printList(Collection<? extends Person> list){
                for(Iterator<Person> it = list.iterator();it.hasNext();){
                	//Person p = it.next();
                    System.out.println(it.next().toString());
                }
            }
    

    当使用范型类或者接口时,传递的具体的类型不确定,可以通过通配符< ? >表示.

    如果想要对被使用的集合中元素类型进行限定,使用范型的限定< ? extends Person>
    //Person是要被使用的集合的父类

    上限: ? extends E //接收E的子类
    下限: ? super E //接收E的父类

    public static <T extends Comparable<? super T>> T getMax(Collection<? extends T> c){}
    

    第一个T是范型函数,
    第二个T表示只有Comparable的子类能用这个函数
    第三个T表示这个函数的返回类型为T
    第四个T表示传递的的参数是T的父类

    展开全文
  • java范型通配符

    2016-08-30 14:19:00
    只看尖括号里边的!!明确点和范围两个概念 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List 如果尖括号里面带有问号,那么代表一个范围,<? extends A> 代表小于等于A的范围,代表大于等于A的范围,...
    1. 只看尖括号里边的!!明确点和范围两个概念
    2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List<A>
    3. 如果尖括号里面带有问号,那么代表一个范围,<? extends A> 代表小于等于A的范围,<? super A>代表大于等于A的范围,<?>代表全部范围
    4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
    5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
    6. List<?>List 是相等的,都代表最大范围
    7. 补充:List既是点也是范围,当表示范围时,表示最大范围
    class A {}
    class B extends A {}
    class C extends A {}
    class D extends B {}
    Which four statements are true ?
    
    //正确的
    The type List<A>is assignable to List.
    The type List<Object>is assignable to List<?>.
    The type List<D>is assignable to List<?extends B>.
    The type List<?extends B>is assignable to List<?extends A>.
    
    //错误的
    The type List<B>is assignable to List<A>.
    The type List<?extends A>is assignable to List<A>.
    The type List<Object>is assignable to any List reference.
    展开全文
  • Java中范型通配符

    2017-10-19 22:02:52
    泛型: 泛型只是在 编译期 保证对象类型相同的技术 真正在代码的运行期,jvm会擦出泛型的存在; 1. 只看尖括号里边的!!明确点和范围两个概念 2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List,...

    泛型:

    泛型只是在 编译期 保证对象类型相同的技术

    真正在代码的运行期,jvm会擦出泛型的存在;


    ex.true:
    The type List<A>is assignable to List;
    The type List<Object>is assignable to List<?>
    The type List<D>is assignable to List<?extends B>
    The type List<?extends B>is assignable to List<?extends A>
    ex.false:

    The type List<B>is assignable to List<A>
    The type List<?extends A>is assignable to List<A>
    The type List<Object>is assignable to any List reference //List<Object> error

    1. 只看尖括号里边的!!明确点和范围两个概念
    2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List<A>,List<B>,List<Object>
    3. 如果尖括号里面带有问号,那么代表一个范围,<? extends A> 代表小于等于A的范围,<? super A>代表大于等于A的范围,<?>代表全部范围
    4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
    5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
    6. List<?>和List 是相等的,都代表最大范围
    ----------------------------------------------------------------------------------
    7.补充:List既是点也是范围,当表示范围时,表示最大范围

    展开全文
  • 定义如下一个简单的范型类,   package com.tom.lang.generics; public class Generics&lt;T&gt; { private T value; public Generics(T value) { this.value = value; } }     @...

     

     

    定义如下一个简单的范型类,

     

    package com.tom.lang.generics;
    
    public class Generics<T> {
        private T value;
        public Generics(T  value) {
            this.value = value;
        }
    }

     

      

        @Test
        public void test() {
            Generics<Integer> v1 = new Generics<Integer>(10);
            Generics<Long> v2 = new Generics<Long>(10L);
            Generics<Object> v3 = new Generics<Object>(new Object());
    
             v1  = v2; //编译错
             v2 = v1; //编译错
             v3 = v1; //编译错
        }

     

    在Java范型一中给已经说到了,上面的三种类型是不兼容的,即v1,v2,v3赋值语句都有编译错。这个例子代码表明,确定范型类的类型,一方面包括范型类本身,另一方面包括类型参数。范型类型只有类型和类型参数相同,才能认为类型是兼容的。

     

    范型通配符

     范型类的类型参数不同导致的类型的变量不能有存放到范型集合中,使用<?>可以通配类型参数,

     

     

            Generics<?>[] array = new Generics[3];
            Generics<Integer> v1 = new Generics<Integer>(10);
            Generics<Long> v2 = new Generics<Long>(10L);
            Generics<Object> v3 = new Generics<Object>(new Object());
            array[0] = v1;
            array[1] = v2;
            array[2] = v3;

     

    限制类型的范型通配符

      使用<? extends  SuperClass>定义限制类型的范型通配符,例如

            Generics<? extends Number>[] array = new Generics[3];
            Generics<Integer> v1 = new Generics<Integer>(10);
            Generics<Long> v2 = new Generics<Long>(10L);
            Generics<Object> v3 = new Generics<Object>(new Object());
            array[0] = v1;
            array[1] = v2;
            array[2] = v3; //编译错

     

     

     使用下面的限制类型的范型通配符,会有编译错,这是为什么?也就是说,通配符不能出现在范型类的范型参数列表中?

     

    public class Generics<? extends Number> {
    
    }

     

     使用<? super ChildType>

     

            Generics2<? super java.sql.Date>[] array = new Generics2[3];
            Generics2<java.util.Date> v3 = new Generics2<java.util.Date>(new java.util.Date());
            array[0] = v3;

     

    上例中,数组中的每个元素的类型参数的类型都是java.sql.Date的父类

     

     

    泛型通配符的应用场景

     带有泛型通配符的泛型类,由于通配符只有在运行时才能确定其真正的类型,因此,泛型通配符在上使用上有一定的限制,

     

     1. 如下的定义会有编译错,原因是?是任意类型,在类中无法使用

     

    public class Generics<? extends Number> {
    
    }

     

     只能像如下的定义,T这个类型参数在编译时虽然没有确定,但是编译时可以知道这个类型是继承自Number的,因此Number可用的方法,对于T来说也可以使用

    public class Generics<T extends Number> {
    
    }

     

     2. 泛型通配符可以用于一致的赋值,例如

     

            Generics<? extends Number>[] array = new Generics[3];
            Generics<Integer> v1 = new Generics<Integer>(10);
            Generics<Long> v2 = new Generics<Long>(10L);
            Generics<Object> v3 = new Generics<Object>(new Object());
            array[0] = v1;

     

     3.又如下面的定义,这个变量定义,可以将泛型类型赋值给var,达到一种Javascript弱类型的效果

     

    public class Generics <T> {
        public static void main(String[] args) {
            Generics<?> var = null;
            var = new Generics<String>();
            var = new Generics<Date>();
        }
    }
     

     

     

     

     

     

    展开全文
  • : 上界通配符, ?表示继承自T的类(沿着类图,上边界是T)。频繁往外读取内容,适合采用上界通配符。 2 <? super T>:下界通配符,?表示T及其父类(沿着类图,下边界是T)。频繁插入内容,适合采用下界通配符。 ...
  • 理解范型中的通配符'?' [java] view plaincopy class A {   public void fun() {   System.out.println("A");   }  }    class B extends A {   @Overr
  • java范型之--通配符

    2015-11-03 16:17:57
    1:界定通配符的上边界 Vector类型1> x = new Vector<类型2>(); 类型1指定一个数据类型,那么类型2就只能是类型1或者是类型1的子类 Vector<? extends Number> x = new Vector();//这是正确的 Vector...
  • 范型

    2020-05-05 15:10:57
    范型 容器里装的东西之间有继承关系,但是容器之间没有继承关系,所以下列...范型上界通配符<? extend A> 接收A类或者A的子类 特性:不能set(),只能get(),get()出来的东西只能放在A类或者A的基类里,例如 ...
  • 一、通配符 ?标识的范型化对象,可以标识任意类型的范型化 ,可以将...通配符范型化的类型 。  Collection c=new ArrayList() ;  c.add(1) ;  c.add(5); //jdk1.5的自动装箱子=功能   showCollection(c) ;
  • 1.super通配符 1.1super通配符第一种用法 泛型的继承关系 Pair<Integer>不是Pair<Number>的子类,如 static void set(Pair<Integer> p, Integer first, Integer last){...} set()不接受Pair<...
  • 2.1extends通配符的第一种用法 如果想要add接收Pair.Integer、Pair.Float、Pair.Double,将Pair类型修改为使方法接收所有泛类型为Number或Number子类的Pair类。 package com.testArray; public class ...
  • 一、通配符 ?标识的范型化对象,可以标识任意类型的范型化 ,可以将任意类型化的值...通配符范型化的类型 。 Collection<Integer> c=new ArrayList() ; c.add(1) ; c.add(5); //jdk1.5的自动装箱子=功能 ...
  • 笔记-范型

    2020-11-24 10:22:40
    一. 范型:参数化类型 二. 使用范型好处: 1. 适用于多种数据类型执行相同代码 2. 提高java程序类型安全 ... 范型方法是独立的,不依赖于类/接口,在范型方法中可以使用通配符(?代表通配符) 声明范型:&l...
  • Java范型与类型擦除

    2019-02-02 22:43:19
    文章目录作用范型方法范型类限定范型的范围类型通配符实现原理——类型擦除 作用 写好一个方法或者一个类,可以处理多种类型的数据,比如说排序算法,可以对String、Double和Integer都起作用 范型方法 语法:输入...
  • 范型与接口

    2020-06-12 19:05:21
    泛型经常使用在类、接口和方法的定义中,分别称为泛型类、泛型接口和泛型方法。...不能实例化泛型数组,除非是无上界的类型通配符,例如:“Generic []a = new Generic [10]”是错误的,而“Generic&...
  • Java范型那些事(二)

    2018-09-05 21:15:46
    《Java范型那些事(一)》 参考oracle官网对于范型的介绍 :https://docs.oracle.com/javase/tutorial/extra/generics/legacy.html 目录 9. 使用通配符?的更多乐趣 通配符捕获 10. 使用范型改写旧代码(未使用...
  • 表示通配符范型。 T其实只是一个代号,相当于对范型的命名,你可以按照Java命名规范给他任意命名,可以是E可以是D可以是UnkownClass。 而如果你写了?则表示在告诉JVM:“我是想用Java的范型来编写这段代码,我在...
  • 范型编程(一)

    2010-09-26 13:45:44
    1 通配符类型 wildcard tyoe: 2 范型类 generic class:具有一个或多个类型变量的类。 3 范型方法: &lt;T&gt; 叫做类型变量,放在修饰符的后面,返回类型的前面。 pubic static &lt;T&gt; T ...
  • java基础进阶—范型

    2020-12-07 11:14:23
    3.通配符类型 4. 虚拟机是如何实现泛型的? Java语言中的泛型只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码...
  • Kotlin中的范型和Java中的比较相似,可以参考我的关于介绍Java范型的文章 : Java范型那些事(一) Java范型那些事(二) Java范型那些事(三) ...泛型主要是侧重于类型的声明的代码复用,通配符则侧重于使用...
  • list<T> 范型

    2018-12-05 18:46:09
    是限制通配符 List&lt;T&gt;一般有两种用途: 1、定义一个通用的泛型方法。 伪代码: public interface Dao{ List&lt;T&gt; getList(){}; } List&lt;String&gt; getStringList(){ ...
  • List接收或返回多种List参数类型

    千次阅读 2019-07-23 18:34:31
    范型,范型通配符的使用<?>,`?`是类型实参,而不是类型形参,此处的`?`和Number、String、Integer一样都是一种实际的类型,可以把`?`看成所有类型的父类。是一种真实的类型。可以解决当具体类型不确定的时候,...
  • 遍历数组练习2:遍历集合三、 泛型3.1 泛型概述3.2 使用泛型的好处3.3 泛型的定义与使用定义和使用含有泛型的类含有泛型的方法含有泛型的接口3.4 泛型通配符通配符基本使用通配符高级使用----受限泛型 一、 ...
  • Java范型那些事(四)

    2019-10-04 09:01:52
    在某些情况下,编译器会推断出通配符的类型,例如,列表可以定义为List<?>,但是在评估表达式时,编译器会从代码中推断出特定类型,此场景称为通配符捕获。 看以下两个方法,其中test1方法中,将i中的一个元素...
  • 通配符 超类型下界限定符? super T 指定类型参数的下限(该类型必须是类型T或者它的父类型)= in 子类型上界限定符? extends T 指定类型参数的上限(该类型必须是类型T或者它的子类型) = out 无界通配符 ? 在...
  • 这篇文章谈一谈Java泛型声明&lt;? extends E&... 是 Upper Bound(上限) 的通配符,用来限制元素的类型的上限,比如 List&lt;? extends Fruit&gt; fruits;  表示集合中的元素类型...
  •  (2), 泛型通配符 Info i = new Info();  (3), 受限泛型 Info temp; 下限 : Info temp;  (4), 泛型 与 子类继承的限制  * 一个类的子类可以通过对象多态性为其父类实例化,但是在泛型操作中,子类的泛型类型...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

范型通配符