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

本文深入探讨了Java中面向对象编程的概念,通过实现生物类、动物类、猫类和狗类,展示了如何利用类型通配符解决不同类集合之间的兼容性问题。重点介绍了List<>类型通配符的上限和下限使用,以及它们在实际编程中的应用,通过实例代码清晰地解释了如何避免编译错误,并有效处理不同类型的数据集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


实体类

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值