java 泛型的通配符和限定
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 泛型的通配符和限定的更多相关文章
- Java泛型之通配符
原文点此链接 使用通配符的原因:Java中的数组是协变的,但是泛型不支持协变. 数组的协变 首先了解下什么是数组的协变,看下面的例子: Number[] nums = new Integer[10]; ...
- JAVA 泛型与通配符的使用
泛型的本质是参数化类型.即所操作的数据类型被指定为一个参数. 1.jdk 1.5/1.6 必须显式的写出泛型的类型. 2.jdk 1.7/1.8 不必显式的写出泛型的类型. 一.泛型声明 可以用< ...
- Java泛型和通配符那点事
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...
- Java 泛型、通配符? 解惑
Java 泛型通配符?解惑 分类: JAVA 2014-05-05 15:53 2799人阅读 评论(4) 收藏 举报 泛型通配符上界下界无界 目录(?)[+] 转自:http://www.linux ...
- java泛型之通配符?
一.在说泛型通配符" ?" 之前先讲几个概念 1.里氏替换原则(Liskov Substitution Principle, LSP): 定义:所有引用基类(父类)的地方必须能透明 ...
- Java 泛型和通配符解惑
转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T 有类型 ? 未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...
- java 泛型与通配符(?)
泛型应用于泛型类或泛型方法的声明. 如类GenericTest public class GenericTest<T> { private T item; public void set( ...
- java 泛型: 通配符? 和 指定类型 T
1. T通常用于类后面和 方法修饰符(返回值前面)后面 ,所以在使用之前必须确定类型,即新建实例时要制定具体类型, 而?通配符通常用于变量 ,在使用时给定即可 ? extends A : 通配符上 ...
- Java泛型(8):自限定&参数协变
自限定 自限定将强制泛型当做自己的边界参数来使用.自限定所做的,就是要求在继承关系中,像下面这样使用这个类: class A extends SelfBounded<A> {} 它的意义是 ...
随机推荐
- python中的selectors模块
它的功能与linux的epoll,还是select模块,poll等类似:实现高效的I/O multiplexing, 常用于非阻塞的socket的编程中: 简单介绍一下这个模块,更多内容查看 pyt ...
- Private表示该属性(方法)为只有本类内部可以访问(类内部可见)。
Public表示该属性(方法)公开: (想用private还要用set和get方法供其他方法调用,这样可以保证对属性的访问方式统一,并且便于维护访问权限以及属性数据合法性) 如果没有特殊情况,属性一定 ...
- c# 根据字段名,得到对象中的属性值
public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj.GetType(); object o ...
- Java SpringBoot中使用sqljdbc4注意事项 java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
因项目需要,需要在Java项目中访问 MSSQLServer 数据库,本地开发的时候,没有问题,可以正常链接数据库,通过Jenkins部署到服务器上时候,报数据库驱动未找到. java.lang.Cl ...
- maven命令package、install、deploy比较
maven生命周期(lifecycle)由各个阶段组成,每个阶段由maven的插件plugin来执行完成.生命周期(lifecycle)主要包括clean.resources.complie.inst ...
- Python 函数(参数组合)
在Python中定义函数,可以用必选参数.默认参数.可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数 定义一 ...
- Linux内核之旅
http://www.kerneltravel.net/ Linux内核之旅 Linux Kernel Travel
- redis如何后台启动
当安装好redis之后,运行redis-server命令之后,显示如图所示: 但是这样没有办法在这个tab下做任何操作了,因为这个时候使用Ctrl+c之后,就变成了这个样子 然后就关闭了,那么我想让r ...
- linux(centos) 添加系统环境变量
系统环境变量,其实就就是一个添加至系统环境中的路径变量. 编译php的扩展时经常会在扩展包源码目录里执行phpize,每次执行的时候都要敲入一大堆目录,诸如:/usr/local/php/bin/ph ...
- day_4.23 简易计算器
''' 简易加减乘除计算器demo 2018-4-23 19:32:49 ''' #1.界面 print("="*50) print(" 欢迎使用计算器v0.1" ...