searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Java 泛型(Generics)使用解析

2023-12-06 06:42:08
1
0

1、介绍

泛型是 Java 5 引入的一种语言特性,主要用于在编译时增强代码的类型安全性。使用泛型可以为类、接口和方法提供类型参数,让它们在使用时能适应更多的类型。这样可以避免类型转换,并且可以提前在编译时捕获错误,而不是在运行时。

2、步骤

定义泛型类和接口

一个泛型类或接口的定义与非泛型版本类似,但是在类名后面添加了尖括号<>,内部包含一个或多个类型参数。

public class Box<T> {
    private T item;

    public T getItem() {
        return item;
    }

    public void setItem(T item) {
        this.item = item;
    }
}

 

使用泛型方法

可以在静态方法和非静态方法中使用泛型。类型参数出现在返回类型之前。

public static <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.print(element + " ");
    }
    System.out.println();
}

类型限定

可以使用 extends 关键字为泛型类型添加边界,这样只有某个类或是其子类可以作为类型参数。

public class BoxNumber<T extends Number> {
    private T number;

    public T getNumber() {
        return number;
    }

    public void setNumber(T number) {
        this.number = number;
    }
}

使用通配符

有时候可能不关心使用的具体类型,但仍希望保证类型安全。这时可以使用通配符?

public static void printBox(Box<?> box) {
    System.out.println(box.getItem());
}

完整的例子

public class GenericsExample {
    public static void main(String[] args) {
        Box<Integer> intBox = new Box<>();
        intBox.setItem(42);
        System.out.println("Integer Box: " + intBox.getItem());

        Box<String> strBox = new Box<>();
        strBox.setItem("Hello, Generics!");
        System.out.println("String Box: " + strBox.getItem());

        Integer[] intArray = {1, 2, 3, 4, 5};
        printArray(intArray);

        BoxNumber<Integer> boundedBox = new BoxNumber<>();
        boundedBox.setNumber(101);
        System.out.println("Bounded Box: " + boundedBox.getNumber());
    }

    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
}

3、注意

  1. 类型擦除:Java 泛型在编译时进行类型检查,但类型信息在运行时被擦除。这是因为 Java 泛型是为了与之前版本的 Java 代码保持兼容性而设计的。

  2. 不能用于静态字段:由于类型擦除,不能将静态字段设置为泛型类型。

  3. 不能实例化参数化类型的数组:例如,new T[10] 是非法的。

  4. 不支持基础类型:泛型只能用于对象类型,不能用于基础类型如 int, char 等。

 

0条评论
0 / 1000
fanjx5
6文章数
0粉丝数
fanjx5
6 文章 | 0 粉丝
原创

Java 泛型(Generics)使用解析

2023-12-06 06:42:08
1
0

1、介绍

泛型是 Java 5 引入的一种语言特性,主要用于在编译时增强代码的类型安全性。使用泛型可以为类、接口和方法提供类型参数,让它们在使用时能适应更多的类型。这样可以避免类型转换,并且可以提前在编译时捕获错误,而不是在运行时。

2、步骤

定义泛型类和接口

一个泛型类或接口的定义与非泛型版本类似,但是在类名后面添加了尖括号<>,内部包含一个或多个类型参数。

public class Box<T> {
    private T item;

    public T getItem() {
        return item;
    }

    public void setItem(T item) {
        this.item = item;
    }
}

 

使用泛型方法

可以在静态方法和非静态方法中使用泛型。类型参数出现在返回类型之前。

public static <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.print(element + " ");
    }
    System.out.println();
}

类型限定

可以使用 extends 关键字为泛型类型添加边界,这样只有某个类或是其子类可以作为类型参数。

public class BoxNumber<T extends Number> {
    private T number;

    public T getNumber() {
        return number;
    }

    public void setNumber(T number) {
        this.number = number;
    }
}

使用通配符

有时候可能不关心使用的具体类型,但仍希望保证类型安全。这时可以使用通配符?

public static void printBox(Box<?> box) {
    System.out.println(box.getItem());
}

完整的例子

public class GenericsExample {
    public static void main(String[] args) {
        Box<Integer> intBox = new Box<>();
        intBox.setItem(42);
        System.out.println("Integer Box: " + intBox.getItem());

        Box<String> strBox = new Box<>();
        strBox.setItem("Hello, Generics!");
        System.out.println("String Box: " + strBox.getItem());

        Integer[] intArray = {1, 2, 3, 4, 5};
        printArray(intArray);

        BoxNumber<Integer> boundedBox = new BoxNumber<>();
        boundedBox.setNumber(101);
        System.out.println("Bounded Box: " + boundedBox.getNumber());
    }

    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
}

3、注意

  1. 类型擦除:Java 泛型在编译时进行类型检查,但类型信息在运行时被擦除。这是因为 Java 泛型是为了与之前版本的 Java 代码保持兼容性而设计的。

  2. 不能用于静态字段:由于类型擦除,不能将静态字段设置为泛型类型。

  3. 不能实例化参数化类型的数组:例如,new T[10] 是非法的。

  4. 不支持基础类型:泛型只能用于对象类型,不能用于基础类型如 int, char 等。

 

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0