java中泛型学习1之类型通配符(?)

简介:

 


实体类

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

}

 

 

目录
相关文章
|
11天前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
40 7
|
20天前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
141 10
|
22天前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
22天前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
48 5
|
22天前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
104 1
|
23天前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
99 5
|
23天前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
140 3
|
23天前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
47 1
|
9天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
54 1

热门文章

最新文章