Java 泛型中的 extends
和 super
是用来限制泛型类型参数的上限和下限的关键字。它们可以在定义泛型类、泛型方法、泛型接口时使用。
extends
关键字用于限制泛型类型参数的上限,表示该泛型类型参数必须是指定类型或指定类型的子类。例如:
public class GenericClass<T extends Number> {
// ...
}
在这个泛型类中,T
的类型参数被限制为 Number
类型或其子类,例如 Integer
、Double
等。这样定义后,如果我们创建这个泛型类的实例时,T
类型的实参必须是 Number
或 Number
的子类。
super
关键字用于限制泛型类型参数的下限,表示该泛型类型参数必须是指定类型或指定类型的父类。例如:
public class GenericClass<T super Integer> {
// ...
}
在这个泛型类中,T
的类型参数被限制为 Integer
类型或其父类。这样定义后,如果我们创建这个泛型类的实例时,T
类型的实参必须是 Integer
或 Integer
的父类。
总的来说,extends
和 super
关键字的作用是限制泛型类型参数的范围,使得泛型类型参数在使用时更加安全和可靠。
举个例子:
在 Java 中,<R, C extends Column<R>>
是一个泛型类型参数的声明,其中:
-
<R, C>
表示这是一个包含两个类型参数的泛型类型参数声明。 -
extends Column<R>
表示泛型类型参数C
是一个继承自Column<R>
类的类型。
这个声明可以被用于定义方法参数、返回类型、类或接口的类型参数等。
具体来说,这个声明的意思是:
-
R
表示这个泛型类型参数中要使用的类型参数,它可以是任何合法的 Java 类型。 -
C
表示这个泛型类型参数中要使用的类型参数,它必须是继承自Column<R>
的类型,也就是说C
类型必须包含一个类型参数为R
的Column
类型。
Column
类型可能是一个抽象类或者接口,也可能是一个具体的类,它的定义可能类似于:
public abstract class Column<R> {
public abstract R getValue();
public abstract void setValue(R value);
// ...
}
或者:
public class StringColumn extends Column<String> {
private String value;
// ...
}
因此,<R, C extends Column<R>>
声明的类型参数 C
表示一个继承自 Column<R>
的类,可以使用 R
来指定这个类型的值类型。当使用这个类型参数时,需要提供一个满足条件的具体类型,例如:
public <R, C extends Column<R>> void someMethod(C column) {
// ...
}
StringColumn column = new StringColumn();
someMethod(column);
在上面的例子中,C
被替换为 StringColumn
,而 R
被替换为 String
。因此,column
参数的类型是 StringColumn
,它继承自 Column<String>
。