📅  最后修改于: 2020-02-12 15:02:34             🧑  作者: Mango
有界类型参数
有时您可能想限制可以在参数中用作参数的数据类型。例如,对数字进行操作的方法可能只希望接受Number或其子类的实例。这就是有界类型参数的用途。
声明一个有界类型参数
语法
请注意,在这种情况下,extends通常用于表示“ extends”(如在类中)。同样,T只能由superClassName或superClassName的子类替换。因此,超类定义了一个包含性的上限。
让我们举一个例子,说明如何使用泛型实现有界类型(扩展超类)。
// 这个类接受A或者A的子类.
// 传入其他类会在编译时报错
class Bound
{
private T objRef;
public Bound(T obj){
this.objRef = obj;
}
public void doRunTest(){
this.objRef.displayClass();
}
}
class A
{
public void displayClass()
{
System.out.println("在超类A内");
}
}
class B extends A
{
public void displayClass()
{
System.out.println("在子类B内");
}
}
class C extends A
{
public void displayClass()
{
System.out.println("在子类C内");
}
}
public class BoundedClass
{
public static void main(String a[])
{
// 创建子类C,传入
Bound bec = new Bound(new C());
bec.doRunTest();
// 创建子类B,传入
Bound beb = new Bound(new B());
beb.doRunTest();
// 传入超类A
Bound bea = new Bound(new A());
bea.doRunTest();
}
}
输出:
在子类C内
在子类B内
在超类A内
现在,我们仅限于类型A及其子类,因此它将对任何其他类型或子类引发错误。
// 这个类接受A或者A的子类.
// 传入其他类会在编译时报错
class Bound
{
private T objRef;
public Bound(T obj){
this.objRef = obj;
}
public void doRunTest(){
this.objRef.displayClass();
}
}
class A
{
public void displayClass()
{
System.out.println("在超类A内);
}
}
class B extends A
{
public void displayClass()
{
System.out.println("在子类B内");
}
}
class C extends A
{
public void displayClass()
{
System.out.println("在子类C内");
}
}
public class BoundedClass
{
public static void main(String a[])
{
// 创建子类C,传入
Bound bec = new Bound(new C());
bec.doRunTest();
// 创建子类B,传入
Bound beb = new Bound(new B());
beb.doRunTest();
// 传入超类A
Bound bea = new Bound(new A());
bea.doRunTest();
Bound bes = new Bound(new String());
bea.doRunTest();
}
}
输出:
error: type argument String is not within bounds of type-variable T
多个范围
绑定类型参数可以与方法以及类和接口一起使用。
Java泛型也支持多个范围。在这种情况下,A可以是接口或类。如果A是类,则B和C应该是接口。在多个范围内,我们不能有多个类。
语法
class Bound
{
private T objRef;
public Bound(T obj){
this.objRef = obj;
}
public void doRunTest(){
this.objRef.displayClass();
}
}
interface B
{
public void displayClass();
}
class A implements B
{
public void displayClass()
{
System.out.println("在超类A内");
}
}
public class BoundedClass
{
public static void main(String a[])
{
// 创建A传入
Bound bea = new Bound(new A());
bea.doRunTest();
}
}
输出:
在超类A内