38_泛型的通配符扩展应用

  • 问题:

    • 定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,该方法如何定义呢?

  • 错误的方式
public static void printCollection(Collection<Object> cols){
    for(Object obj:cols){
        System.out.println(obj);
    }
    /**
    cols.add("string");//没错
    cols=new HashSet<Date>();//会报告错误!
    */
}

 

  • 正确的方式:
public static void printCollection(Collection<?> cols){
    for(Object obj:cols){
        System.out.println(obj);
    }
    /**
    cols.add("string");//错误,因为他不知道自己未来匹配就一定是Stirng
    cols.size();//没错,此方法与类型参数没有关系
    cols=new HashSet<Date>();//没错,可以和 Collection<?>画等号
    */
}

  • 总结:
    • 使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

上图中,大红叉的方法都是和类型相关的,在使用泛型通配符?时,不能调用。

Collection<?> a可以和任意参数化的类型匹配,但到底匹配的是什么类型,只有以后才知道,所以,

a=new ArrayList<Integer>();和 a= new ArrayList<String>();都可以,但a.add(new Date);或者 a.add("abc");都不行。

 

Cols<Object>中的Object只是说明Cols<Object>实例对象中的方法接收的参数是Object

Cols<Object>是一种具体类型,new HashSet<Date>也是一种具体类型,两者没有兼容性。

 

 

 

 

  • 泛型中?通配符的扩展

    • 限定通配符的上边界
      • 正确  Vector<? extends Number> x=new Vector<Integer>();
      • 错误   Vector<? extends Number> x=new  Vector<String>();
    • 限定通配符的下边界
      • 正确  Vector<? super Integer> x=new Vector<Number>();
      • 错误  Vector<? super Integer> x=new Vector<Byte>();
    • 提示
      • 限定通配符总是包括自己
时间: 2024-11-27 05:12:48

38_泛型的通配符扩展应用的相关文章

Java的泛型和通配符

泛型:1.泛型类    class A<T>{    }2.在创建实例时,需要为其类型变量赋值 3.泛型方法    class A<T>{        public T fun1(){}        public void fun2(T t){}        //以上两个都不是泛型方法,他们是泛型类里面的一个方法        //发现方法要求需要在方法上有泛型的定义        public <T> T fun3(){}//此为泛型方法    } class

java 泛型实例详解(普通泛型、 通配符、 泛型接口)

java 泛型详解(普通泛型. 通配符. 泛型接口) 2013-02-04 19:49:49| 分类: JAVA | 标签:java |举报|字号 订阅 下载LOFTER客户端 JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其实Java的泛型就是创建一个用类型作为参数的类.就象我们写类的方法一样,方法是这样的method(String str1,String

JAVA 泛型与通配符的使用

泛型的本质是参数化类型.即所操作的数据类型被指定为一个参数. 1.jdk 1.5/1.6 必须显式的写出泛型的类型. 2.jdk 1.7/1.8 不必显式的写出泛型的类型. 一.泛型声明 可以用<T>.<K,V>.<T  extends  Number>等进行泛型的声明.其中,<T  extends  Number>的声明方式限定了T的范围,T只能为 Number的子类. 1.参数类型用在类的创建中,泛型类. 2.参数类型用在接口的创建中,泛型接口. 3.参

java 泛型详解(普通泛型、 通配符、 泛型接口)

java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其 实Java的泛型就是创建一个用类型作为参数的类.就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1.str2的值是可变的.而泛型也是一样的,这样写class Java_Generics<K

链式编程:泛型实现的扩展方法类

序言 本文分享一个用链式编程思想和泛型实现的扩展方法类,用于减少代码量,并提供更为清晰的业务逻辑代码表达. 概念 链式编程:将多个业务逻辑(方法)通过“.”(点号)串联起来的一种代码风格,形似链条,故称链式编程.核心思想在于每个方法均返回自身实例. 泛型:可以理解为是一个类的“篮子“”,只要符合约束的类均可以放置在该“篮子”里面. 扩展方法:向现有类添加方法. 根据泛型和扩展方法的特点,泛型+扩展方法实现了向所有符合约束的“类”添加方法,可减少重复代码量. (.Net语言提供了这么优雅的特性,刚

JAVA泛型-通配符

黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA泛型-通配符 一.泛型与继承 有如下的继承关系和以它们为类型参数的泛型: public class Holder<T>{ T t; public Holder(){} public Holder(T at){ t = at;} public void set(T at){ t = at;} public T get(){return t; } } //有如下代码: Holder<Apple> apple

泛型的通配符

http://stackoverflow.com/questions/14346622/list-vs-list-extends-object http://stackoverflow.com/questions/8055389/whats-the-difference-between-and-extends-object-in-java-generics http://stackoverflow.com/questions/12340808/whats-the-difference-betwe

Java泛型之通配符

原文点此链接 使用通配符的原因:Java中的数组是协变的,但是泛型不支持协变. 数组的协变 首先了解下什么是数组的协变,看下面的例子: Number[] nums = new Integer[10]; // OK 因为Integer是Number的子类,一个Integer对象也是一个Number对象,所以一个Integer的数组也是一个Number的数组,这就是数组的协变. Java把数组设计成协变的,在一定程度上是有缺陷的.因为尽管把Integer[]赋值给Number[],Integer[]

Java泛型和通配符那点事

泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象. 因为Map.get()被定义为返回Object