java泛型(三)、通配符的使用

原创 2012年08月31日 13:21:54

通配符有三种:

1、无限定通配符   形式<?>

2、上边界限定通配符 形式< ? extends Number>    //用Number举例

3、下边界限定通配符    形式< ? super Number>    //用Number举例

1、泛型中的?通配符

如果定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据,如果这样写

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
publicclass GernericTest {
    publicstaticvoid main(String[] args) throws Exception{
        List<Integer> listInteger =new ArrayList<Integer>();
        List<String> listString =new ArrayList<String>();
        printCollection(listInteger);
        printCollection(listString);    
    } 
    publicstaticvoid printCollection(Collection<Object> collection){
               for(Object obj:collection){
            System.out.println(obj);
        }  
    }
}

语句printCollection(listInteger);报错

The method printCollection(Collection<Object>) in the type GernericTest is not applicable for the arguments (List<Integer>)

这是因为泛型的参数是不考虑继承关系就直接报错。

这就得用?通配符

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

publicclass GernericTest {
    publicstaticvoid main(String[] args) throws Exception{
        List<Integer> listInteger =new ArrayList<Integer>();
        List<String> listString =new ArrayList<String>();
        printCollection(listInteger);
        printCollection(listString);
    }
    publicstaticvoid printCollection(Collection<?> collection){
               for(Object obj:collection){
            System.out.println(obj);
        }
    }
}


在方法public static void printCollection(Collection<?> collection){}中不能出现与参数类型有关的方法比如collection.add();因为程序调用这个方法的时候传入的参数不知道是什么类型的,但是可以调用与参数类型无关的方法比如collection.size();

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

 

 

2、泛型中的?通配符的扩展

1:界定通配符的上边界

Vector<? extends 类型1> x = new Vector<类型2>();

类型1指定一个数据类型,那么类型2就只能是类型1或者是类型1的子类

Vector<? extends Number> x = new Vector<Integer>();//这是正确的

Vector<? extends Number> x = new Vector<String>();//这是错误的

 

2:界定通配符的下边界

Vector<? super 类型1> x = new Vector<类型2>();

类型1指定一个数据类型,那么类型2就只能是类型1或者是类型1的父类

Vector<? super Integer> x = new Vector<Number>();//这是正确的

Vector<? super Integer> x = new Vector<Byte>();//这是错误的

 

提示:限定通配符总是包括自己





版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LonelyRoamer/article/details/7927212

三句话总结JAVA泛型通配符(PECS)

在JAVA的泛型集合中,默认都可以添加null,除此以外,还有以下三条规则。1. “?”不能添加元素以“?”声明的集合,不能往此集合中添加元素,所以它只能作为生产者(亦即它只能被迭代),如下:List...
  • yiifaa
  • yiifaa
  • 2017-06-18 16:24:29
  • 924

java泛型编程学习 笔记三:泛型继承规则以及通配符“?”使用

java泛型编程 泛型类型的继承规则 以及通配符类型的总结
  • u011784767
  • u011784767
  • 2017-01-04 10:46:29
  • 3134

Java泛型三:通配符详解extends super

[TOC] 在java泛型中,? 表示通配符,代表未知类型,< ? extends Object>表示上边界限定通配符,< ? super Object>表示下边界限定通配符。? 与 T 的区别T:...
  • claram
  • claram
  • 2016-07-18 17:21:03
  • 10836

Java 泛型通配符?解惑

一、通配符的上界 既然知道List并不是List的子类型,那就需要去寻找替他解决的办法, 是AnimalTrianer.act()方法变得更为通用(既可以接受List类型,也可以接受List等参...
  • Baple
  • Baple
  • 2014-05-05 15:53:43
  • 36214

Java之泛型进阶——泛型通配符

主要记录泛型的边界与通配符相关,通配符上限,通配符下限。
  • chenghuaying
  • chenghuaying
  • 2016-03-15 21:21:06
  • 1614

深入理解泛型,类型通配符<?>,类型通配符上限,下限

一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static voi...
  • Davidluo001
  • Davidluo001
  • 2015-12-15 16:36:23
  • 3326

Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限

泛型:         一种程序设计语言的新特性,于Java而言,在JDK 1.5开始引入。泛型就是在设计程序的时候定义一些可变部分,在具体使用的时候再给可变部分指定具体的类型。在Java中泛型主要体...
  • caiandyong
  • caiandyong
  • 2016-06-02 11:09:50
  • 8180

泛型&泛型的通配符使用

泛型   package itheima.com.GenericEx; import java.lang.reflect.InvocationTargetException; import j...
  • yaomqiao
  • yaomqiao
  • 2014-05-15 10:27:04
  • 703

Java 泛型通配符解释

前言 最近看Rxjava retrofit 中到处都是泛型类型定义,不得不重新整理一下资料,简单介绍,满足基本理解使用。定义什么是泛型?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形...
  • o279642707
  • o279642707
  • 2017-04-06 16:45:45
  • 683

Java泛型-- 通配符

通配符在本文的前面的部分里已经说过了泛型类型的子类型的不相关性。但有些时候,我们希望能够像使用普通类型那样使用泛型类型:◆ 向上造型一个泛型对象的引用◆ 向下造型一个泛型对象的引用向上造型一个泛型对象...
  • flfna
  • flfna
  • 2011-06-30 09:46:00
  • 20360
收藏助手
不良信息举报
您举报文章:java泛型(三)、通配符的使用
举报原因:
原因补充:

(最多只允许输入30个字)