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. 【emWin】例程三十二:窗口对象———Progbar

    简介: 进度条通常在应用程序中用于实现虚拟化:本例程实现液晶亮度显示 . 触摸校准(上电可选择是否进入校准界面) 实验现象: 实验指导书及代码包下载: 链接:http://pan.baidu.com/ ...

  2. Angularjs中config中置入以下拦截器

    $httpProvider.interceptors.push(['$rootScope', '$q', '$localStorage', function ($rootScope, $q, $loc ...

  3. [Laravel] 11 - WEB API : cache & timer

    前言 一.资源 Ref: https://www.imooc.com/video/2870 二.缓存 缓存:静态缓存.Memcache.redis缓存 Ref: [Laravel] 09 - Func ...

  4. 记一次 Spring 事务配置踩坑记

    记一次 Spring 事务配置踩坑记 问题描述:(SpringBoot + MyBatisPlus) 业务逻辑伪代码如下.理论上,插入数据 t1 后,xxService.getXxx() 方法的查询条 ...

  5. CentOS使用virt-what知道虚拟机的虚拟化技术

    通常拿到一台vps,提供商可能不会告诉我们具体的虚拟化技术,对于CentOS的系统的vm,可以使用virt-what来知道. 如果提示virt-what命令找不到,则需要安装一下 yum instal ...

  6. c# 日期函数DateTime.ToString()日期的各种格式 (本人亲测)

    c# 日期函数DateTime.ToString()日期的各种格式  (本人亲测) 平时写代码的过程难免遇到对日期的格式转换,这个时候很容易忘记具体格式的转换是什么,当然这不是什么复杂的,查一下就能找 ...

  7. windows 清理利器

    https://www.ccleaner.com/ 2. https://www.chuyu.me/zh-Hans/index.html

  8. MySQL 出现You can't specify target table for update in FROM clause错误解决方法

    MySQL出现You can’t specify target table for update in FROM clause 这个错误的意思是不能在同一个sql语句中,先select同一个表的某些值 ...

  9. CentOS7.5 Linux搭建全文检索--Solr7.4.0单机服务

    一.Solr安装环境 1.官方参考文档 Solr教程参考指南:http://lucene.apache.org/solr/guide/7_4/solr-tutorial.html 2.Solr运行环境 ...

  10. Jenkins解决无法获取插件的办法(升级站点目录)

    Jenkins解决无法获取插件的办法 可能是由于Jenkins的更新网站被QIANG,因此,请替换插件的服务器地址: http://mirror.xmission.com/jenkins/update ...