泛型
1.1概念
Java中的泛型是一种使类、接口和方法能够处理未知类型的机制。通过泛型,可以在编译时捕获许多类型错误,从而提高了类型安全性。
在Java中,泛型的主要用途是增加代码的重用性,减少代码冗余,以及使类或方法可以处理多种类型的数据。
以下是一些关于Java泛型的要点:
-
定义:泛型允许在类、接口或方法定义时指定一个或多个类型参数。这些类型参数在类、接口或方法被实例化时被具体的类型替换。
-
类型参数:类型参数使用大写字母表示,后面可能跟着一个问号以表示该类型参数是受限制的。
-
通配符:使用问号(?)表示通配符,代表未知的类型。例如,List<?> 表示一个可以包含任何类型的列表。
-
类型擦除:由于泛型信息在运行时可能不再可用,因此Java使用类型擦除来删除原始泛型信息,同时保留类型参数在编译时的所有信息。
-
边界:通过在类型参数后面添加边界,可以限制类型参数的可能值。例如,List<T extends Number> 表示列表中的元素必须是Number或其子类。
-
使用场景:泛型经常用于集合类,如List、Set、Map等,以及自定义类和方法中。
-
编译时检查:由于泛型是在编译时处理的,因此所有涉及的类型错误都会在编译时捕获,而不是在运行时。
1.2泛型方法
1.2.1定义格式:修饰符 <类型参数> 返回值类型 方法名(参数列表) { // 方法体 } // 类型参数用大写字母表示
public class GenericsTest1 {
// 定义泛型继承Number
public static <T extends Number> double add(T n1,T n2) { // 只能传递Numebr类型或Number的子类
double d = n1.doubleValue() + n2.doubleValue();
return d;
}
public static void main(String[] args) {
System.out.println(add(1,2)); //3.0
System.out.println(add(3.5,4.5)); // 8.0
System.out.println(add('a','b')); // 编译错误
}
}
1.3泛型类
class Point<T>{ // 此处可以随便写标识符号,T是type的简称
private T value ; // value的类型由T指定,即:由外部指定
public T getValue(){ // 返回值的类型由外部决定
return value ;
}
public void setValue(T value){ // 设置的类型也由外部决定
this.value = value ;
}
}
public class GenericsDemo1{
public static void main(String args[]){
Point<String> p = new Point<String>() ; // 里面的value为String类型
p.setValue("it") ; // 设置字符串 it
System.out.println(p.getValue().length()) ; // 取得字符串的长度 2
}
}
1.4泛型接口
interface test<T extends Number> { // 传递过来的类型只能是Number类或者它的子类
T getValue(T t); // 返回值为泛型变量
}
class testImpl<T extends Number> implements test<T> { // 实现test类
@Override
public T getValue(T t) {
System.out.println(t);
return t;
}
}
public class GenericsDemo2 {
public static void main(String[] args) {
testImpl<Integer> t = new testImpl<Integer>(); // 传递Integer类型
t.getValue(4); // 必须传入整形
testImpl<Double> d = new testImpl<>(); // 传递Double类型
d.getValue(4.0); // 必须传入double值
}
}