Java泛型是指编写的代码可以用于不同类型的对象,在编译时被检查的编程机制。Java泛型类在定义和使用上相对简单,但仍然需注意一些技巧和规则。
一、泛型类的定义
泛型类可以定义在类名后面的尖括号里,用于限定类中的变量类型。对于泛型类,需要注意以下几点:
1、泛型类的类型参数
泛型类的类型参数定义在类名后面的尖括号内。泛型类的类型参数可以有多个,它们之间用逗号分隔。类型参数可以在类中任意使用,作为类型变量使用,可以作为属性类型、方法参数类型、方法返回类型等。
public class GenericsClass<T, U> { private T obj1; private U obj2; public GenericsClass(T obj1, U obj2) { this.obj1 = obj1; this.obj2 = obj2; } public T getObj1() { return obj1; } public U getObj2() { return obj2; } }
2、在实例化泛型类时指定类型参数
在实例化泛型类时需要指定类型参数,即使只有一个类型参数也要加上尖括号。当实例化泛型类时,所有的T类型都将被具体的类型替换。
GenericsClass<Integer, String> obj = new GenericsClass<Integer, String>(100, "Guru99");
二、使用泛型类
泛型类可以像普通类一样使用。但是,由于可以指定不同的参数类型,因此可以更灵活地使用方法和属性。以下是使用泛型类的示例:
public class Main { public static void main(String[] args) { GenericsClass<Integer, String> obj = new GenericsClass<Integer, String>(100, "Guru99"); System.out.println(obj.getObj1()); System.out.println(obj.getObj2()); } }
上面的代码输出结果为:
100
Guru99
三、泛型方法的定义和使用
泛型方法是指定义时带有类型参数的方法。泛型方法和泛型类一样,可以用于处理多种类型的数据。以下是使用泛型方法的示例:
1、定义泛型方法
泛型方法中的参数类型不是固定的,而是动态的。定义泛型方法时,需要在方法的返回类型前放置类型参数声明。当调用泛型方法时,可以在方法名前指定类型参数或自动推断类型参数。
public class GenericsMethod { public <T> void printArray(T[] inputArray) { for (T element : inputArray) { System.out.printf("%s ", element); } System.out.println(); } }
2、使用泛型方法
不像普通方法一样,泛型方法需要在调用时指定类型参数,或可以被自动推断。下面是使用泛型方法的示例:
public class Main { public static void main(String[] args) { Integer[] intArray = { 1, 2, 3, 4, 5 }; Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 }; Character[] charArray = { 'H', 'E', 'L', 'L', 'O' }; GenericsMethod genericsMethod = new GenericsMethod(); System.out.println("Array integerArray contains:"); genericsMethod.printArray(intArray); System.out.println("\nArray doubleArray contains:"); genericsMethod.printArray(doubleArray); System.out.println("\nArray characterArray contains:"); genericsMethod.printArray(charArray); } }
上面的代码输出结果为:
Array integerArray contains:
1 2 3 4 5
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O
四、通配符
通配符(Wildcard)是一种类型参数,用于表示“任意类型”。可以在方法的参数中使用通配符,以增加参数的灵活性。可以使用“?”代替具体的类型,如“List”。
以下是使用通配符的示例:
public class GenericsWildcard { public static double sumList(List<? extends Number> list) { double sum = 0.0; for (Number i : list) { sum += i.doubleValue(); } return sum; } }
通过使用通配符,可以处理不同的类型,例如:
public class Main { public static void main(String[] args) { List<Integer> intList = Arrays.asList(1, 2, 3); List<Double> doubleList = Arrays.asList(1.2, 2.3, 3.4); System.out.println("The sum of the integer list is " + GenericsWildcard.sumList(intList)); System.out.println("The sum of the double list is " + GenericsWildcard.sumList(doubleList)); } }
上面的代码输出结果为:
The sum of the integer list is 6.0
The sum of the double list is 6.9