JAVA泛型的部分分析

这是一个java小白写的一篇关于泛型在分析与解惑,写这个博客是因为期末作业,写的不好或者分析的不到位请轻喷0.0,那接下来分析一下泛型。Java 泛型是 Java 语言的一个特性,它允许开发者在编写代码时指定类型参数,以提高代码的复用性和类型安全性。简单来说他就是一种Java的程序语言,那如何运用这个语言是我今天要分析的内容

泛型的好处

  1. 类型安全:编译时检查类型,避免类型转换错误。
  2. 代码复用:相同的代码可以用于不同的数据类型,减少代码冗余。
  3. 消除类型转换:减少不必要的类型转换,提高代码的可读性和可维护性。

泛型的使用场景

  1. 类和接口:定义泛型类或接口,使用类型参数代替具体的类型。
  2. 方法:定义泛型方法,允许方法接受不同类型的参数。
  3. 数组和集合:使用泛型定义数组和集合,确保元素类型的一致性。

泛型的语法

  1. 定义泛型类或接口

    public class Box<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } }
  2. 定义泛型方法

    public <T> void printArray(T[] array) { for (T item : array) { System.out.print(item + " "); } }
  3. 使用泛型数组和集合

    List<String> list = new ArrayList<String>(); Map<String, Integer> map = new HashMap<String, Integer>();

泛型的类型参数

  1. 非具体化类型:使用大写字母(如 T, E, K, V)作为类型参数的占位符。
  2. 有界类型参数:可以限制类型参数的上限或下限。
    • 上限<T extends Number> 表示 T 必须是 Number 或其子类。
    • 下限<T super Object> 表示 T 必须是 Object 或其超类。

泛型的类型擦除

  1. 类型擦除:Java 泛型在编译时存在,但在运行时被擦除,即类型参数被替换为 Object 类型。
  2. 类型擦除的影响:由于类型擦除,泛型类或接口的实例在运行时无法直接访问其类型参数。

泛型的通配符

  1. 无限制通配符? 表示任意类型。
  2. 有限制通配符
    • ? extends T:表示 T 或 T 的子类。
    • ? super T:表示 T 或 T 的超类。

泛型的注意事项

  1. 基本类型:泛型类型参数不能是基本类型(如 int, double),必须使用包装类(如 Integer, Double)。
  2. 静态上下文:静态上下文中不能使用泛型类型参数。
  3. 协变与逆变:泛型不支持协变和逆变,即不能将 List<Number> 赋值给 List<Integer>

泛型的高级特性

  1. 泛型方法的继承:子类可以继承父类的泛型方法。
  2. 泛型方法的重载:可以重载泛型方法,但需要注意类型参数的一致性。

以上是关于java的相关简单分析,如果觉得难,我们分析一下一个简单的案例

private static <T> void inputContent(T t){ System.out.println("打印传入的数据:"+t); }
public static void main( String args[] ){ inputContent("String"); inputContent(123); }

以上程序中前面第一条定义了一个泛型类,第二个程序就是调用了这个泛型,一个很简单的程序调用,调用inputcontent处理数据输出。

定义泛型类

泛型类通过在类名后面添加类型参数来定义。类型参数通常用单个大写字母表示,如 T、E、K、V 等

public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

在这个例子中,Box 是一个泛型类,T 是类型参数,可以是任何类型。

使用泛型类

创建泛型类的实例时,你需要指定类型参数的实际类型。

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello, World!");
String content = stringBox.getContent();

在这个例子中,Box 类的实例 stringBox 被指定为存储 String 类型的对象。

Java 使用类型擦除来实现泛型,这意味着在运行时,所有的类型参数都会被擦除,被替换为它们的限定类型或 Object 类型。因此,泛型类在运行时不会保留其类型参数信息。

泛型类的字段

泛型类的字段必须是其类型参数的类型或其子类型。

public class Box<T> {
    private T item; // 正确
    private List<T> items; // 正确
    private List rawItems; // 错误,不能直接使用原始类型
}

泛型类的方法

泛型类可以定义普通方法和泛型方法。

  • 普通方法:方法的参数和返回类型可以是类型参数或其具体化类型。
  • 泛型方法:在类内部定义的泛型方法,具有自己的类型参数。
    public class Utils {
        public <T> void printArray(T[] array) {
            for (T item : array) {
                System.out.println(item);
            }
        }
    }

    定义出一个具有自己的类型参数

  • 当使用泛型类作为另一个类的字段或方法参数时,可以使用通配符代替具体的类型参数。

    public class Warehouse {
        private List<Box<?>> boxes; // 存储不同类型的 Box 实例
    }

    泛型类的数组

    Java 不允许直接实例化泛型数组,因为数组在 Java 中是协变的,而泛型是不可协变的。

  • Box<T>[] boxes = new Box<T>[10]; // 错误,不能这样使用
    Box<T>[] boxes = (Box<T>[]) new Box<?>[10]; // 错误,不安全转换

    正确的编写格式才能正确运行,或者说按照要求处理数据

  • 以上就是一个小白来自Java泛型的部分分析和分享,还有的部分我就分析不到了,在学习泛型语句的过程中我遇到了不少麻烦,后面发现还蛮有趣的,谢谢大家观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值