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");
} }

最新文章

  1. 剑指offer:赋值运算符函数和复制构造函数
  2. js制作简单的计算器
  3. linux文档常见后缀名
  4. python表达式
  5. Java学习之路(七)
  6. git filename to long问题解决
  7. 正确使用stl vecotr erase函数
  8. Aizu 2302 On or Off dfs/贪心
  9. mysql datestamp坑
  10. android获取在res文件下的图片资源
  11. [Android]ADT Run时候报错:The connection to adb is down, and a severe error has occured
  12. JavaScript高级程序设计:第二章
  13. Python之向日志输出中添加上下文信息
  14. VirtualBox: Resize a Fedora, CentOS, or Windows Dynamic Guest Virtual Disk (VDI) in VirtualBox
  15. 【linux】mkfifo 命令创建命名管道实现进程之间通信
  16. javascript入门篇(四)
  17. 2018-2019-2 网络对抗技术 20165328 Exp6 信息收集与漏洞扫描
  18. Back-off pulling image \&quot;registry.access.redhat.com/rhel7/pod-infrastructure:latest
  19. Java NIO 详解(二)
  20. oracle 无法启动图形界面,no protocol specified

热门文章

  1. WebDriver--操控浏览器
  2. OBJ Loader Source Code
  3. 【iCore3 双核心板】例程七:WWDG看门狗实验——复位ARM
  4. linux服务器性能优化
  5. the serializable class XXX does not declare a static final seriaVersionUID...的问题
  6. 关于c中的%x及其它格式化符
  7. action接收到来自jsp页面的请求时出现中文乱码问题处理方法
  8. vim温馨提示
  9. C#实现对mongoDB的简单增删查改
  10. 转 Java输入输出流详解(非常详尽)
  11. 【转】一文掌握 Linux 性能分析之网络篇
  12. Python开发【第三篇】:函数&amp;读写文件
  13. 使用html5 Canvas绘制线条(直线、折线等)
  14. Vue单元测试Karma+Mocha
  15. PAT 1081 Rational Sum
  16. ubuntu16.04无法关机解决方法
  17. 场景服务只创建了 Service Difinition 和feature layer
  18. juquery去除字符串前后的空格
  19. iOS在framework中使用CoreData出现崩溃问题及解决方法
  20. enumerate遍历列表