泛型限定二---用父类定义比较器,用于子类,减少代码,节约空间

/*
 定义比较器的时候可以定义父类的比较器,这样其子类对象都可以调用,避免了要根据不同的对象定义不同的比较器。
 */
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

class compare implements Comparator<Person2>{
	public int compare(Person2 t1, Person2 t2) {
		// TODO 自动生成的方法存根
		return t1.getName().compareTo(t2.getName());
	}
}
public class GenericDemo2 {
	public static void main(String[] args) {
		TreeSet<Student3> ts=new TreeSet<Student3>(new compare());
		ts.add(new Student3("abc001"));
		ts.add(new Student3("abc003"));
		ts.add(new Student3("abc002"));
		ts.add(new Student3("abc004"));
		
		Iterator<Student3> it=ts.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next().getName());
		}
		TreeSet<Worker> wk=new TreeSet<Worker>(new compare());
			wk.add(new Worker("w---abc001"));
			wk.add(new Worker("w---abc006"));
			wk.add(new Worker("w---abc004"));
			wk.add(new Worker("w---abc003"));
			wk.add(new Worker("w---abc005"));
			Iterator<Worker> it1=wk.iterator();
			while(it1.hasNext()){
				System.out.println(it1.next().getName());
			}
	}
}

class Person2{
	private String name;
	Person2(String name){
		this.name=name;
	}
	public String getName(){
		return name;
	}
}
class Student3 extends Person2{
	Student3(String name){
		super(name);
	}
}
class Worker extends Person2{
	Worker(String name){
		super(name);
	}
}


结果:


Java中,泛型是一种强类型机制,它可以让你在编译时检查类型错误,从而提高代码的安全性和可读性。在使用泛型时,我们经常会遇到父类子类泛型转换问题。 首先,我们需要明确一点:子类泛型不能转换成父类泛型。这是因为Java中的泛型是不协变的。例如,如果有一个类A和它的子类B,那么List<A>和List<B>之间是不存在继承关系的。 下面我们来看一个例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 } } ``` 在这个例子中,我们定义了Animal类和它的子类Dog。然后我们定义了两个List,分别是List<Animal>和List<Dog>。如果将List<Dog>赋值给List<Animal>,会出现编译错误。这是因为List<Animal>和List<Dog>之间不存在继承关系。 那么,如果我们想要让子类泛型转换成父类泛型,应该怎么办呢?这时我们可以使用通配符来解决问题。通配符可以表示任意类型,包括父类子类。例如,我们可以将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 下面我们来看一个使用通配符的例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 List<? extends Animal> list3 = new ArrayList<>(); list3 = list2; // 正确 } } ``` 在这个例子中,我们定义了List<? extends Animal>来表示任意继承自Animal的类型。然后我们将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 总结一下,Java中的泛型是不协变的,子类泛型不能转换成父类泛型。如果需要实现子类泛型转换成父类泛型,可以使用通配符来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚振伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值