Java 泛型学习二 泛型的限制

Java 泛型学习一 泛型概念
Java 泛型学习二 泛型的限制
Java 泛型学习三 通配符
Java 泛型学习四 自动擦除
Java 泛型学习五 泛型擦除带来的不自然
Java 泛型学习六 泛型类型系统

在实际开发过程中,有时需要限制类型变量的类型,使其在一定范围内,这就要使用extends关键字,基本语法如下:

类型变量 extends 限定类型序列
  • ”限定类型序列“表示类型变量实际可以指定的范围,例如"T extends Fruit"表示类型变量T的类型只能为Fruit或其子类类型;
  • “限定类型序列”可以有多个类型,这些类型可以是类也可以接口,多个类型之间使用“&”分割,但最多只能有一个类,这和Java是单继承类似的,可以有多个接口;如果“限定类型序列”中有类,类必须放在第一个;

示例代码:

package net.oseye;

public class FanXing {
	public static void main(String[] args) {
		Fruit fruit=new Fruit();
		fruit.setColor("未知水果,未知颜色!");
		Apple apple=new Apple();
		apple.setColor("有红苹果和青苹果,但不知道这个苹果是什么颜色!");
		Apple redApple=new RedApple();
		redApple.setColor("红色!");
		Apple greenApple=new GreenApple();
		greenApple.setColor("青色!");
		
		SayColor(apple);
		SayColor(redApple);
		SayColor(greenApple);
		//SayColor(fruit);
	}
	
	static <T extends Apple> void SayColor(T apple){
				System.out.println(apple.getColor());
	}

}

class Fruit{
	private String color;
	public void setColor(String color){
		this.color=color;		
	}
	public String getColor(){
		return this.color;		
	}
}
class Apple extends Fruit{
}
class RedApple extends Apple{
}
class GreenApple extends Apple{
}

如果删除SayColor(fruit);的注释,会提示如下异常信息:

net\oseye\FanXing.java:17: 错误: 无法将类 FanXing中的方法 SayColor应用到给定类型
;
                SayColor(fruit);
                ^
  需要: T
  找到: Fruit
  原因: 推断类型不符合声明的范围
    推断: Fruit
    范围: Apple
  其中, T是类型变量:
    T扩展已在方法 <T>SayColor(T)中声明的Apple
1 个错误

可见,泛型的限制起到了作用。

原文地址:https://www.cnblogs.com/zhaiqianfeng/p/4618357.html