您的位置:

Java泛型类的定义和使用

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