前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java的泛型(三)

java的泛型(三)

原创
作者头像
堕落飞鸟
发布2023-04-03 07:22:49
3020
发布2023-04-03 07:22:49
举报
文章被收录于专栏:飞鸟的专栏

五、泛型的注意事项

泛型类型参数只存在于编译时

在Java中,泛型类型参数只存在于编译时,运行时并不存在泛型类型。在运行时,所有的泛型类型参数都会被擦除,并被替换为它们的上限类型(如果没有显式指定上限类型,则被替换为Object类型)。

例如,在下面的代码中,虽然T是一个泛型类型参数,但在运行时,所有的T类型都会被擦除并被替换为Object类型:

代码语言:javascript
复制
public class MyGenericClass<T> {
    private T value;
    public void setValue(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }
}

MyGenericClass<Integer> myObj = new MyGenericClass<Integer>();
myObj.setValue(123);
Integer value = myObj.getValue(); // 编译时类型为Integer,运行时类型为Object

在上面的代码中,value的编译时类型是Integer,但在运行时它的实际类型却是Object。这是因为在运行时,所有的泛型类型参数都会被擦除,并被替换为它们的上限类型。

不能使用基本类型作为泛型类型参数

在Java中,不能使用基本类型作为泛型类型参数。如果需要使用基本类型,可以使用对应的包装类,例如Integer代替intDouble代替double等。

例如,在下面的代码中,我们定义了一个泛型类MyGenericClass<T>,但是如果尝试使用基本类型作为T的实际类型参数,会发生编译错误:

代码语言:javascript
复制
MyGenericClass<int> myObj = new MyGenericClass<int>(); // 编译错误

在上面的代码中,由于使用了基本类型int作为T的实际类型参数,因此会发生编译错误。如果想要使用基本类型,可以使用对应的包装类Integer作为实际类型参数:

代码语言:javascript
复制
MyGenericClass<Integer> myObj = new MyGenericClass<Integer>();

泛型类型参数不能使用原始类型

在Java中,泛型类型参数不能使用原始类型。如果需要使用原始类型,可以使用通配符?代替泛型类型参数。

例如,在下面的代码中,我们定义了一个泛型类MyGenericClass<T>,但是如果尝试使用原始类型作为T的实际类型参数,会发生编译错误:

代码语言:javascript
复制
MyGenericClass<int[]> myObj = new MyGenericClass<int[]>(); // 编译错误

在上面的代码中,由于使用了原始类型int[]作为T的实际类型参数,因此会发生编译错误。如果想要使用原始类型,可以使用通配符?代替泛型类型参数:

代码语言:javascript
复制
MyGenericClass<?> myObj = new MyGenericClass<int[]>();

泛型类型参数不能使用静态变量或静态方法

在Java中,泛型类型参数不能使用静态变量或静态方法。如果需要使用静态变量或静态方法,可以使用泛型类或泛型方法。

例如,在下面的代码中,我们尝试在静态方法中使用泛型类型参数T,会发生编译错误::

代码语言:javascript
复制
public class MyGenericClass<T> {
    private static T value; // 编译错误,静态变量不能使用泛型类型参数
    public static <T> T getValue() { // 正确,使用泛型方法
        return value;
    }
}

在上面的代码中,由于静态变量和静态方法都不能使用泛型类型参数,因此我们可以使用泛型类和泛型方法来解决这个问题。在上面的代码中,我们使用了泛型方法来实现静态方法getValue(),并使用类型参数<T>来代替泛型类型参数T

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 五、泛型的注意事项
    • 泛型类型参数只存在于编译时
      • 不能使用基本类型作为泛型类型参数
        • 泛型类型参数不能使用原始类型
          • 泛型类型参数不能使用静态变量或静态方法
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档