一文教懂你如何使用Java的泛型

一文教懂你如何使用Java的泛型

一、前言在Java这门编程语言中,泛型这个知识点是我认为新手小白进阶Java语言的难点之一。

另外一个难点,我认为是多线程,这个主要难在理解,编码语法不难,所以有点人对这个知识生拉硬套。

回到Java的泛型,对它的理解,对他的编码使用,都有一点难度。不能直接的生硬的去使用,如果不好好理解Java泛型是干什么的话,后面遇到泛型,该懵逼的还是会懵逼。

那么这个时候,本篇文章,会清楚的讲解Java泛型的使用以及理解

二、泛型由来在Java1.5以前,我们可以写出这样的代码,并且编译期间不报错

代码语言:javascript复制package com.banmoon;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

public class Main {

public static void main(String[] args) {

List list = new ArrayList();

list.add(1);

list.add("2");

list.add(new Date());

String s = (String) list.get(2);

}

}可是当我们真正在运行的时候,这段代码就会报出ClassCastException的异常

这是因为,我们没有明确定义list集合当中的元素是个什么样的类型,现在Java有了这个泛型,就可以将问题提前在编译前暴露出来

将上面的代码改成使用泛型的样子,就可以看到编辑器直接就爆红显示了

代码语言:javascript复制package com.banmoon;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

public class Main {

public static void main(String[] args) {

List list = new ArrayList<>();

list.add(1);

list.add("2");

list.add(new Date());

String s = (String) list.get(2);

}

}image-20250205193747046这就是泛型,用来规定其中类当中某个属性的类型,限制了这个属性只能为某个类

三、泛型的使用1)自己的类使用泛型在代码中,泛型的使用采用<>进行标识,我们先看下,如何自己定义一个使用泛型的类

我定义了一个Person类,里面有两个属性(姓名、资产)

至于资产是什么,我这边暂时不清楚,所以使用了泛型,

这边使用了字母T,临时当做了类名称,等到时候实例化的时候就知道了

代码语言:javascript复制package com.banmoon;

import lombok.Data;

@Data

public class Person {

/**

* 姓名

*/

private String name;

/**

* 资产

*/

private T property;

}使用起来就是这个样子的

代码语言:javascript复制package com.banmoon;

public class Main {

public static void main(String[] args) {

Person person = new Person<>();

person.setName("banmoon");

person.setProperty(new Car());

}

}

class Car {

}可以看到,直接实例化就行,在声明处指定一下泛型位具体的类型;后面这个实例化对象就只能使用Car作为这个人的资产

2)泛型的继承经过上面的入门,你已经初步会了泛型的使用。

那么想想,上面的代码是否有不足之处,万一我将一坨屎作为资产呢?

这不合理吧,太恶心了,资产对象只能是有价值的东西,所以我们必须要让泛型实现一个接口

所以,经过这段分析,我们先创建一个接口Property

代码语言:javascript复制package com.banmoon;

/**

* 资产

*/

public interface Property {

}我们规定,人的资产必须要实现这个接口,那我们泛型Person类要如何改动呢

如下即可,只需要规定下是泛型继承自Property接口即可

代码语言:javascript复制package com.banmoon;

import lombok.Data;

@Data

public class Person {

/**

* 姓名

*/

private String name;

/**

* 资产

*/

private T property;

}改动好了,再回过头去看看,刚刚写的代码,编辑器爆红了

image-20250205195303295我们将Car实现Property即可,这样就不报错了

image-202502051954002713)如何在方法中使用泛型刚刚都是属性,现在看看如何在方法中使用泛型

其实,这也非常简单,只需要在限定修饰符后加上,自己的<>符号,在当中定义自己的泛型字母后,入参中就可以使用这个泛型字母了

同样的,在方法中可以使用这个入参做出方法的逻辑动作

代码语言:javascript复制 private void showOther(O o) {

System.out.println(o.toString());

}注意一下,如果类上面有定义好泛型,方法上想要同样的的类型,就可以不用再方法上定义了

如下,我就简单写一个两个人交换资产的方法

代码语言:javascript复制package com.banmoon;

import lombok.Data;

@Data

public class Person {

/**

* 姓名

*/

private String name;

/**

* 资产

*/

private T property;

/**

* 交换资产

*/

public void exchangeProperty(Person person) {

T selfProperty = this.getProperty();

this.setProperty(person.getProperty());

person.setProperty(selfProperty);

}

}如此就完成了,两个人交换资产的方法了

我们来用一下,两个人分别有一辆车,现在需要进行兑换

代码语言:javascript复制package com.banmoon;

public class Main {

public static void main(String[] args) {

Person person = new Person<>();

person.setName("banmoon");

person.setProperty(new Car());

Person person1 = new Person<>();

person1.setName("banmoon1");

person1.setProperty(new Car());

person.exchangeProperty(person1);

}

}

class Car implements Property {

}但是,如果两个人是不同的资产,就不允许进行兑换了,如下

image-20250205200558471这是因为person这个对象,在实例化出来的时候,它的资产就是固定的Car,而person1的资产是Money

所以person对象的交换资产的方法,就固定死了,只能是相同有Car这个资产的人才能交换

那么,这个该如何改动呢,让他们之间的资产能够相互进行转换

其实,这也非常简单,只需要简单改动下实例化的信息即可,就像这样

image-202502052010239204)静态方法中使用泛型刚刚将的是普通方法,考虑到与实例对象之间有联动,就显得复杂了点

那么静态方法,非常简单,定义和普通方法一样,直接在静态修饰符后添加上即可

代码语言:javascript复制package com.banmoon;

public class Main {

public static void show(O o) {

System.out.println(o);

}

}四、最后泛型的使用就是这样,它就是为了规定其中某项元素为特定的类型,或者暂时不清楚具体的类型而定下的

上面讲解的都是单泛型,在我们自己开发的时候,一个优秀的设计往往会简约的抽象泛型,一般一个泛型即可

但是为了代码的高度复用,有些类可能会采用多个泛型来设计,这个时候看源码,我建议优先看注释,这个类是做什么的,里面的每一个泛型类分别有什么作用。

好了,希望本篇文章,对您有帮助!!!

相关推荐

大乘进化券需要肝的时间
365BET官网

大乘进化券需要肝的时间

01-30 405
东亚杯-女足0-2落后追至2-2 遭绝杀2-3负朝鲜
在4月出生的名人有谁?哪些明星伟人在4月出生?