java泛型:泛型类,泛型接口,泛型方法,泛型集合

简介: java泛型:泛型类,泛型接口,泛型方法,泛型集合

泛型


泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)


泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。


dc01fa2b28584435bcc45875a3d9a043.png



泛型类


语法:类名

T表示类型占位符,表示一种引用类型,如果编写多个,使用逗号隔开。

创建泛型类:

public class MyGeneric<T> {}


使用泛型:

package Generic;
//泛型类
//语法:类名<T>
//T表示类型占位符,表示一种引用类型,如果编写多个,使用逗号隔开。
public class MyGeneric<T> {
    //使用泛型T
//    1.创建变量
     T t;
    //    2.作为方法的参数
    public void show(T t) {
        //不能实例化,即不能new
        System.out.println(t);
    }
    //    3.泛型作为方法的返回值
    public T getT() {
        return t;
    }
}


测试泛型类:

package Generic;
public class TestGeneric {
    public static void main(String[] args) {
//        注意:
//        1.泛型只能使用引用类型
//        2.不同泛型对象之间不能互相复制
//        使用泛型类创建字符串对象
        MyGeneric<String> gen1=new MyGeneric<String>();
        gen1.t="hello";
        gen1.show("加油!");
        String str=gen1.getT();
        // 使用泛型类创建数字对象
        MyGeneric<Integer> gen2=new MyGeneric<Integer>();
        gen2.t=12;
        gen2.show(45);
        Integer in=gen2.getT();
    }
}



泛型接口


语法:接口名

注意:不能创建泛型静态常量

创建泛型接口:

package Generic;
//泛型接口
//语法:接口名<T>
//不能创建泛型静态常量
public interface MyInterface<T> {
String name="uzi";
//在没有使用泛型接口之前并不知道类型,所以不能用new
T server(T t);
}


接口不能实例化,所以要创建一个接口实现类:

package Generic;
public class MyInterfaceImpl1 implements MyInterface<String>{
    //    在传递类型的时候确定类型为String
    @Override
    public String server(String s) {
        System.out.println(s);
        return s;
    }
}


这里的MyInterfaceImpl1在实现MyInterface接口的时候,传递的类型确定类型为String。也可以不规定类型,接口实现类代码:

package Generic;
public class MyInterfaceImpl2<T>  implements MyInterface<T>{
//    在传类型的时候不确定
    @Override
    public T server(T t) {
        System.out.println(t);
        return t;
    }
}



测试泛型接口:

package Generic;
public class TestGeneric {
    public static void main(String[] args) {
//        测试泛型接口
        MyInterfaceImpl1 impl1=new MyInterfaceImpl1();
        impl1.server("ming");
        MyInterfaceImpl2 impl2=new MyInterfaceImpl2();
        impl2.server(1000);
        impl2.server("uzi");
    }
}


imlp1由于在实现接口类中规定了类型,所以必须是String,而impl2没有规定类型,即可以创建不同类型。



泛型方法


语法: 返回值类型

创建泛型方法:

package Generic;
//泛型方法
//语法:<T> 返回值类型
public class MyGenericMethod {
//    创建泛型方法
    public <T> void show(T t){
        System.out.println("泛型方法"+t);//无返回值
    }
    public <T> T show2(T t){
        System.out.println("泛型方法"+t);//有返回值
        return t;
    }
}


测试泛型方法:

package Generic;
public class TestGeneric {
    public static void main(String[] args) {
//        测试泛型方法
        MyGenericMethod myGenericMethod=new MyGenericMethod();
        myGenericMethod.show("你好啊");//不需要规定类型
        myGenericMethod.show(3.14);
        myGenericMethod.show2(123);//类型由传递的数据决定
    }
}



泛型集合


即泛型在集合中的使用

泛型集合测试代码:

package Generic;
import java.util.ArrayList;
import java.util.Iterator;
public class MyArrayList {
    public static void main(String[] args) {
/*        ArrayList arrayList=new ArrayList();
        arrayList.add("uzi");
        arrayList.add(22);
        arrayList.add("ming");
        arrayList.add(23);//可以向集合中添加任何类型的数据
        for (Object o : arrayList) {
            String str=(String) o;
            System.out.println(str);
        }//报错,因为类型不同有String类型也有int类型*/
//        使用泛型避免异常
        ArrayList<String> arrayList=new ArrayList<String>();
        arrayList.add("uzi");
//        arrayList.add(22);//报错,只能添加String类型的
        arrayList.add("ming");
        ArrayList<Student> arrayList1=new ArrayList<Student>();
        Student s1 = new Student("uzi", 23);
        Student s2 = new Student("ming", 24);
        arrayList1.add(s1);
        arrayList1.add(s2);
        arrayList1.add(new Student("doinb",26))
//        arrayList1.add("1451");
//遍利
        Iterator<Student> it = arrayList1.iterator();
        while (it.hasNext()){
            Student s=it.next();//拿到的类型就是Student,而不是Object,不要需要再进行强制类型转换
            System.out.println(s.toString());
        }
    }
}


其中Student类代码:

package Generic;
public class Student {
    public String name;
    public int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
相关文章
|
6天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
6天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
14 2
|
6天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
7天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
21 1
|
10天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
50 4
|
11天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
10天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
11 0
|
3月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
3月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
23天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
52 5