博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中泛型之类型通配符(?)
阅读量:6835 次
发布时间:2019-06-26

本文共 2502 字,大约阅读时间需要 8 分钟。

实体类

package cn.xy.model;

/**

 * 生物类
 * @author xy
 * 
 */
public class Living
{
 private String name;

 public Living(String name)

 {
  super();
  this.name = name;
 }

 public String getName()

 {
  return name;
 }

 public void setName(String name)

 {
  this.name = name;
 }

 @Override

 public String toString()
 {
  return name;
 }
}

 

/**

 * 动物类
 * @author xy
 * 
 */
public class Animal extends Living
{
 public Animal(String name)
 {
  super(name);
 }
}

 

/**

 * 猫类
 * @author xy
 *
 */
public class Cat extends Animal
{
 public Cat(String name)
 {
  super(name);
 }
}

/**
 * 狗类
 * @author xy
 *
 */
public class Dog extends Animal
{
 public Dog(String name)
 {
  super(name);
 }
}

 

测试类1

import java.util.ArrayList;

import java.util.List;
import cn.xy.model.Animal;
import cn.xy.model.Cat;
import cn.xy.model.Dog;
import cn.xy.model.Living;

public class Test

{
 /**
  * 虽Cat和Dog是Animal的子类,但List<Cat>和List<Dog>不是List<Animal>的子类

  * 直接为该方法传入List<Cat>和List<Dog>编译会错误 。

  * 如List<Stirng>不是List<Object>的子类一样。
  */
 public static void GetNames1(List<Animal> animals)
 {
  for (Animal a : animals)
  {
   System.out.println(a.getName());
  }
 }

 /**

  * 该方法使用类型通配符,可以使用任何类型的List来调用它,其类型均为Object
  */
 public static void GetNames2(List<?> animals)
 {
  for (Object obj : animals)
  {
   Animal a = (Animal) obj;
   System.out.println(a.getName());
  }
 }

 /**

  * 该方法设置了类型通配符的上限,即传入的List的类型必须是Animal的子类或者Animal本身
  */
 public static void GetNames3(List<? extends Animal> animals)
 {
  for (Animal a : animals)
  {
   System.out.println(a.getName());
  }
 }

 /**

  * 该方法设置了类型通配符的下限,即传入的List的类型必须是Animal的父类或者Animal本身
  */
 public static void GetNames4(List<? super Animal> animals)
 {
  for (Object a : animals)
  {
   System.out.println(a);
  }
 }

 public static void main(String[] args)

 {
  List<Cat> cats = new ArrayList<Cat>();
  cats.add(new Cat("Tomcat"));
  cats.add(new Cat("Tomcat2"));

  List<Dog> dogs = new ArrayList<Dog>();

  dogs.add(new Dog("Tomdog"));
  dogs.add(new Dog("Tomdog2"));

  List<Living> livings = new ArrayList<Living>();

  livings.add(new Living("living1"));
  livings.add(new Living("living2"));

  // GetNames1(cats);

  // GetNames1(dogs);
  GetNames2(cats);
  GetNames2(dogs);
  GetNames3(cats);
  GetNames3(dogs);
  // GetNames4(cats);
  // GetNames4(dogs);
  GetNames4(livings);

 }

}

测试类2

import java.util.ArrayList;

import java.util.List;

public class Test2

{

 /**

  * 添加的对象必须是和?一样的类型或者是其子类,但并不知道?是什么类型 所以lst.add会产生编译错误,故不能向其中添加对象
  * null值是一个例外,因为null是所有引用类型的实例
  */
 public static void main(String[] args)
 {
  List<?> lst = new ArrayList<String>();
  // lst.add("str");
 }

}

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1030100如需转载请自行联系原作者

woshixuye111

你可能感兴趣的文章
[转载]PS各个工具的字母快捷键和英文全名
查看>>
Java中的单例模式
查看>>
Android初学者教程
查看>>
java web项目使用log4j的使用笔记
查看>>
linux磁盘挂载
查看>>
透過proxychains讓不支持代理的程序通過代理上網
查看>>
自学篇之--js 提取复选框和单选框的值 和纯css的3D按钮
查看>>
安卓入门笔记之Activity
查看>>
关于Shiro框架权限标识符中*使用的总结
查看>>
Hibernate中HQL函数汇总及其说明
查看>>
用到lucene的爬虫的简单实现
查看>>
nodejs环境安装
查看>>
mac easy_install 安装插件失败
查看>>
java sso
查看>>
在Eclipse下面安装spket
查看>>
Xcode常用快捷键
查看>>
lua 入门(一)
查看>>
ActiveReport的小数显示方法
查看>>
10款在线网站原型设计工具 总有一款适合你
查看>>
【ZZ】使用github管理Eclipse分布式项目开发
查看>>