package cn.sasa.demo1;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class ListDemo {
public static void main(String[] args) {
//泛型的通配符 ?
Collection<String> strColl = new ArrayList<String>();
Collection<Integer> intColl = new ArrayList<Integer>(); strColl.add("hahaha");
intColl.add(111); //strColl 和 intColl 都可以成为 printColl方法的参数,因为<>里写了通配符?,匹配所有的数据类型
printColl(strColl);
printColl(intColl); //泛型的限定
//如果<>里用?匹配所有的类型,会有安全隐患
//设计一个方法,使其可以调用Dog类的集合和Cat类的集合中元素的speak()方法
Collection<Dog> dogColl = new ArrayList<Dog>();
dogColl.add(new Dog("Wangcai",4));
dogColl.add(new Dog("aHuang",3)); Collection<Cat> catColl = new ArrayList<Cat>();
catColl.add(new Cat("Kittey",6));
catColl.add(new Cat("Ruby",2)); speak(dogColl);
speak(catColl); //Collection<String> testColl = new ArrayList<String>();
//testColl.add("qqq");
//speak(testColl);//报错,因为testColl里的元素不是Animal的子类 }
/**
* 使不同的泛型集合都可以调用这个方法
* 泛型的通配符 ?
*/
static void printColl(Collection<?> coll) {
Iterator<?> it = coll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
} /**
* ? extends 限定为某个类的子类
* ? super 限定为某个类的父类
*/
static void speak(Collection<? extends Animal> coll) {
Iterator<? extends Animal> it = coll.iterator();
while(it.hasNext()) {
Animal animal = it.next();
animal.speak();
}
}
}
package cn.sasa.demo1;

public abstract class Animal {
private String type;
private int age;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} public abstract void speak();
}
package cn.sasa.demo1;

public class Dog extends Animal{

    public Dog(String type, int age) {this.setType(type);
this.setAge(age);
}
@Override
public void speak() {
System.out.println(this.getType() + " Wang wang");
} }
package cn.sasa.demo1;

public class Cat extends Animal{

    public Cat(String type, int age) {this.setType(type);
this.setAge(age);
}
@Override
public void speak() {
System.out.println(this.getType() + " Mellow mellow");
} }

java 泛型的通配符和限定的更多相关文章

  1. Java泛型之通配符

    原文点此链接 使用通配符的原因:Java中的数组是协变的,但是泛型不支持协变. 数组的协变 首先了解下什么是数组的协变,看下面的例子: Number[] nums = new Integer[10]; ...

  2. JAVA 泛型与通配符的使用

    泛型的本质是参数化类型.即所操作的数据类型被指定为一个参数. 1.jdk 1.5/1.6 必须显式的写出泛型的类型. 2.jdk 1.7/1.8 不必显式的写出泛型的类型. 一.泛型声明 可以用< ...

  3. Java泛型和通配符那点事

    泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...

  4. Java 泛型、通配符? 解惑

    Java 泛型通配符?解惑 分类: JAVA 2014-05-05 15:53 2799人阅读 评论(4) 收藏 举报 泛型通配符上界下界无界 目录(?)[+] 转自:http://www.linux ...

  5. java泛型之通配符?

    一.在说泛型通配符" ?" 之前先讲几个概念 1.里氏替换原则(Liskov Substitution Principle, LSP): 定义:所有引用基类(父类)的地方必须能透明 ...

  6. Java 泛型和通配符解惑

    转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T  有类型 ?  未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...

  7. java 泛型与通配符(?)

    泛型应用于泛型类或泛型方法的声明. 如类GenericTest public class GenericTest<T> { private T item; public void set( ...

  8. java 泛型: 通配符? 和 指定类型 T

    1. T通常用于类后面和 方法修饰符(返回值前面)后面 ,所以在使用之前必须确定类型,即新建实例时要制定具体类型, 而?通配符通常用于变量 ,在使用时给定即可 ? extends A  :  通配符上 ...

  9. Java泛型(8):自限定&参数协变

    自限定 自限定将强制泛型当做自己的边界参数来使用.自限定所做的,就是要求在继承关系中,像下面这样使用这个类: class A extends SelfBounded<A> {} 它的意义是 ...

随机推荐

  1. 教你一招:Microsoft Office Word已停止工作

    1/按组合键WIN+R打开运行对话框 2/在打开框中键入%USERPROFILE%\AppData\Roaming\Microsoft\Templates,单击“确定”按钮 3/在打开的窗口鼠标右键删 ...

  2. Java知多少(53)使用Java创建自己的异常子类

    尽管Java的内置异常处理大多数常见错误,你也许希望建立你自己的异常类型来处理你所应用的特殊情况.这是非常简单的:只要定义Exception的一个子类就可以了(Exception当然是Throwabl ...

  3. Ubuntu 中的VI和vim

    转载出处:http://blog.csdn.net/xiajun07061225/article/details/7039413 或功能键[Home]:移动到这一行的最前面字符处. $或功能键[End ...

  4. linux mysql卸载

    卸载mysql 1.查找以前是否装有mysql 命令:rpm -qa|grep -i mysql 可以看到mysql的包: mysql-libs-5.1.71-1.el6.x86_64 2.删除mys ...

  5. python 带正则的search 模块

    glob  是python 提供的一个支持正则表达式的查找文件的模块. 实现上采用了os.listdir() 和 fnmatch.fnmatch().  但是没有真的invoking a subshe ...

  6. python中利用redis构建任务队列(queue)

    Python中的使用标准queue模块就可以建立多进程使用的队列,但是使用redis和redis-queue(rq)模块使这一操作更加简单. Part 1. 比如首先我们使用队列来简单的储存数据:我们 ...

  7. Centos7 安装PHP7版本及php-fpm,redis ,php-redis,hiredis,swoole 扩展安装

    ============================PHP7.1 ========================================= 1. 更换rpm 源,执行下面两个 rpm - ...

  8. A股ROE连续3年超过15%的股票排名

    R连续3年,12个季度的滚动ROE,都超过15%的股票排名,个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多ROE连续3年超过15%的股 ...

  9. python网络编程之UDP方式传输数据

    UDP --- 用户数据报协议(User Datagram Protocol),是一个无连接的简单的面向数据报的运输层协议. UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能 ...

  10. mysql常用语句和函数

    mysql语句如果长期不写,就会忘掉,所以要时常复习,温故而知新. 1.select length("中国人"),select char_length("中国人" ...