Java泛型-语法与常用实例

简介: Java泛型-语法与常用实例

Java泛型

六:总结提升

一:故事背景

最近回顾了很早之前学的java基础,其中涉及到了泛型的概念,今天总结到此,以供大家参考以及自己的日后学习。


二:什么是Java泛型

在Java中,泛型是一种参数化类型的机制,它可以让类、接口、方法在定义时使用一个或多个类型参数,这些类型参数可以在实例化时被具体的类型所代替。


三:Java泛型的用法

下面将会分别写出Java泛型的用法,语法都将内含其中。


3.1泛型类

接下来我会通过定义一个泛型类来表示一个集合,可以让这个集合可以存储任何类型的对象,而不需要在定义时指定具体的类型。使用时再去指定集合中元素的类型,避免在运行时发生类型错误。


3.3.1 MyList 泛型类

public class MyList<T> {
    private List<T> list = new ArrayList<>();
    public void add(T element) {
        list.add(element);
    }
    public T get(int index) {
        return list.get(index);
    }
    public int size() {
        return list.size();
    }
}

在这个例子中,MyList 是一个泛型类,它的类型参数是 T。我们可以使用 MyList 来存储任何类型的对象,只需要在实例化时指定具体的类型即可

3.3.2 具体使用

MyList<Integer> intList = new MyList<>();
intList.add(1);
intList.add(2);
System.out.println(intList.get(0)); // 输出 1
MyList<String> stringList = new MyList<>();
stringList.add("hello");
stringList.add("world");
System.out.println(stringList.get(0)); // 输出 hello

3.2泛型接口

泛型接口是一个可以定义泛型类型参数的接口。

3.2.1 泛型接口

public interface MyList<T> {
    void add(T element);
    T get(int index);
    int size();
}

这是一个泛型接口,它定义了一个可以存储任何类型的元素的列表。在实现该接口时,需要指定具体的类型参数.

3.2.2 具体使用

public class MyIntegerList implements MyList<Integer> {
    private List<Integer> list = new ArrayList<>();
    @Override
    public void add(Integer element) {
        list.add(element);
    }
    @Override
    public Integer get(int index) {
        return list.get(index);
    }
    @Override
    public int size() {
        return list.size();
    }
}

3.3泛型方法

泛型方法是一种定义在类中但具有泛型类型参数的方法,它可以在调用时指定不同的类型参数。

3.3.1 泛型方法

public static <T> T getFirst(List<T> list) {
    return list.get(0);
}

这是一个泛型方法,它可以接受任何类型的 List 对象,并返回该列表的第一个元素。在调用时,可以指定不同的类型参数。

3.3.2 具体使用

List<Integer> intList = Arrays.asList(1, 2, 3);
Integer first = getFirst(intList); // 返回 1
List<String> stringList = Arrays.asList("hello", "world");
String firstString = getFirst(stringList); // 返回 "hello"

四:Java泛型的好处


提高代码的可读性和可维护性:使用泛型可以使代码更加简洁、易读,减少代码冗余和重复的类型检查,降低了出错的可能性。


减少强制类型转换:在使用泛型时,编译器可以自动推断类型参数,无需进行强制类型转换,这减少了编写代码时的工作量,并使代码更加优雅。


支持代码重用:泛型代码可以在多个地方重用,而不需要进行修改。例如,在集合框架中,可以使用相同的方法来处理不同类型的集合。


支持灵活的数据结构:通过使用泛型,可以创建灵活的数据结构,使其能够处理不同类型的数据。

五:使用Java泛型的注意事项

在使用Java泛型时,有一些注意事项需要注意:


泛型类型参数不能是基本数据类型:泛型类型参数只能是类或接口类型,不能直接使用基本数据类型(如int、char、boolean)。如果需要使用基本数据类型,可以使用对应的包装类(如Integer、Character、Boolean)作为泛型参数。


泛型类型参数不能使用原生态类型:原生态类型是指未指定泛型类型参数的泛型类型。例如,List是一个原生态类型,而List<String>是具有泛型类型参数的参数化类型。在使用泛型时,应尽量避免使用原生态类型,而是使用具体的参数化类型。


泛型类型参数无法在运行时获取:由于Java的泛型使用类型擦除来实现,泛型信息在编译时被擦除,无法在运行时获取。这意味着无法在运行时判断一个对象的具体泛型类型参数。因此,在使用泛型时需要注意,泛型参数的具体类型只能在编译时进行检查。


泛型数组的创建受限:Java中不允许直接创建泛型数组,例如new T[]是不合法的。这是因为Java泛型数组的创建会涉及到类型擦除的问题,无法进行安全的类型检查。如果需要创建泛型数组,可以通过创建一个Object数组,然后进行强制类型转换来实现。


泛型类型参数不能用于静态上下文:由于泛型类型参数是在实例化时确定的,而静态成员和静态方法是在类加载时就存在的,无法访问实例化的泛型类型参数。因此,静态上下文中不能直接使用泛型类型参数,可以使用通配符或将泛型参数定义在静态方法或静态成员所在的类上。


通配符的使用限制:通配符(wildcard)用于表示不确定的类型参数,包括无界通配符(?)和有界通配符(如? extends T和? super T)。在使用通配符时,需要注意,无界通配符只能用于读取,不能用于写入;有界通配符可以用于读取和写入,但受到类型边界的限制。


泛型方法和泛型类的类型参数可以独立:在泛型类中,类级别的类型参数和方法级别的类型参数是独立的,即方法中的类型参数可以与类中的类型参数不同。这使得在泛型类的方法中可以使用额外的类型参数,增加了灵活性。


泛型类型参数的擦除和桥方法:在泛型类或接口中,由于类型擦除的原因,编译器会生成桥方法来保


持多态性。桥方法是编译器生成的方法,用于在类型擦除后保持泛型方法的多态性。


这些是使用Java泛型时需要注意的一些事项。理解并正确使用泛型可以提高代码的类型安全性和重用性。同时,还可以通过阅读相关的Java泛型文档和学习材料,深入了解泛型的原理和使用技巧。


六:总结提升

总之,Java中的泛型是一种非常强大和有用的机制,它可以提高代码的可读性和可维护性,减少强制类型转换,支持代码重用,同时还可以创建灵活的数据结构,适应不同的需求!


目录
相关文章
|
12天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
27 1
|
13天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
25 2
|
11天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
10天前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
12 0
[Java]泛型
|
12天前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
13 1
|
12天前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速入门,建议查阅“简洁”系列教程。本文重点探讨Kotlin与Java共存的高级话题,包括属性访问、空安全、泛型处理、同步机制及SAM转换等,助你在项目中逐步引入Kotlin。
13 1
|
13天前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
Kotlin语法笔记(28) -Kotlin 与 Java 混编
18 2
|
18天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
38 3
|
19天前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
10 1
|
27天前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
26 5