创建泛型类
泛型使类,接口和方法能够将其他类和接口作为类型参数。
此示例使用泛型类 Param
获取单个类型参数 T
,由尖括号(<>
)分隔:
public class Param<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
要实例化此类,请提供类型参数来代替 T
。例如,Integer
:
Param<Integer> integerParam = new Param<Integer>();
type 参数可以是任何引用类型,包括数组和其他泛型类型:
Param<String[]> stringArrayParam;
Param<int[][]> int2dArrayParam;
Param<Param<Object>> objectNestedParam;
在 Java SE 7 及更高版本中,type 参数可以替换为名为 diamond 的 一组空类型参数(<>
) :
Version >= Java SE 7
Param<Integer> integerParam = new Param<>();
与其他标识符不同,类型参数没有命名约束。然而,他们的名字通常是大写的第一个字母。 (即使在官方 JavaDocs 中也是如此。)
例子包括 T
用于 type
, E
用于 element
, K
/ V
用于 key
/value
。
扩展泛型类
public abstract class AbstractParam<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
AbstractParam
是一个使用 T
类型参数声明的抽象类 。扩展此类时,该类型参数可以由 <>
中写入的类型参数替换,或者类型参数可以保持不变。在下面的第一个和第二个例子中,String
和 Integer
替换了类型参数。在第三个示例中,类型参数保持不变。第四个例子根本不使用泛型,所以它类似于类有 Object
参数。编译器会警告 AbstractParam
是一个原始类型,但它会编译 ObjectParam
类。第五个示例有 2 个类型参数(请参阅下面的多个类型参数),选择第二个参数作为传递给超类的类型参数。
public class Email extends AbstractParam<String> {
// ...
}
public class Age extends AbstractParam<Integer> {
// ...
}
public class Height<T> extends AbstractParam<T> {
// ...
}
public class ObjectParam extends AbstractParam {
// ...
}
public class MultiParam<T, E> extends AbstractParam<E> {
// ...
}
以下是用法:
Email email = new Email();
email.setValue("test@example.com");
String retrievedEmail = email.getValue();
Age age = new Age();
age.setValue(25);
Integer retrievedAge = age.getValue();
int autounboxedAge = age.getValue();
Height<Integer> heightInInt = new Height<>();
heightInInt.setValue(125);
Height<Float> heightInFloat = new Height<>();
heightInFloat.setValue(120.3f);
MultiParam<String, Double> multiParam = new MultiParam<>();
multiParam.setValue(3.3);
请注意,在 Email
类中,T getValue()
方法的行为就像它具有 String getValue()
的签名一样,而 void setValue(T)
方法的行为就像它被宣告为 void setValue(String)
一样。
也可以使用带有空花括号的匿名内部类({}
)进行实例化:
AbstractParam<Double> height = new AbstractParam<Double>(){};
height.setValue(198.6);
请注意,不允许使用带有匿名内部类的菱形。
多种类型参数
Java 提供了在泛型类或接口中使用多个类型参数的功能。通过在尖括号之间放置以逗号分隔的类型列表,可以在类或接口中使用多个类型参数。例:
public class MultiGenericParam<T, S> {
private T firstParam;
private S secondParam;
public MultiGenericParam(T firstParam, S secondParam) {
this.firstParam = firstParam;
this.secondParam = secondParam;
}
public T getFirstParam() {
return firstParam;
}
public void setFirstParam(T firstParam) {
this.firstParam = firstParam;
}
public S getSecondParam() {
return secondParam;
}
public void setSecondParam(S secondParam) {
this.secondParam = secondParam;
}
}
用法可以如下完成:
MultiGenericParam<String, String> aParam = new MultiGenericParam<String, String>("value1", "value2");
MultiGenericParam<Integer, Double> dayOfWeekDegrees = new MultiGenericParam<Integer, Double>(1, 2.6);