在Java这门编程语言中,泛型这个知识点是我认为新手小白进阶Java语言的难点之一。
另外一个难点,我认为是多线程,这个主要难在理解,编码语法不难,所以有点人对这个知识生拉硬套。
回到Java的泛型,对它的理解,对他的编码使用,都有一点难度。不能直接的生硬的去使用,如果不好好理解Java泛型是干什么的话,后面遇到泛型,该懵逼的还是会懵逼。
那么这个时候,本篇文章,会清楚的讲解Java泛型的使用以及理解
在Java1.5以前,我们可以写出这样的代码,并且编译期间不报错
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有了这个泛型,就可以将问题提前在编译前暴露出来
将上面的代码改成使用泛型的样子,就可以看到编辑器直接就爆红显示了
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<String> list = new ArrayList<>();
list.add(1);
list.add("2");
list.add(new Date());
String s = (String) list.get(2);
}
}
这就是泛型,用来规定其中类当中某个属性的类型,限制了这个属性只能为某个类
在代码中,泛型的使用采用<>进行标识,我们先看下,如何自己定义一个使用泛型的类
我定义了一个Person类,里面有两个属性(姓名、资产)
至于资产是什么,我这边暂时不清楚,所以使用了泛型,
这边使用了字母T,临时当做了类名称,等到时候实例化的时候就知道了
package com.banmoon;
import lombok.Data;
@Data
public class Person<T> {
/**
* 姓名
*/
private String name;
/**
* 资产
*/
private T property;
}使用起来就是这个样子的
package com.banmoon;
public class Main {
public static void main(String[] args) {
Person<Car> person = new Person<>();
person.setName("banmoon");
person.setProperty(new Car());
}
}
class Car {
}可以看到,直接实例化就行,在声明处指定一下泛型位具体的类型;后面这个实例化对象就只能使用Car作为这个人的资产
经过上面的入门,你已经初步会了泛型的使用。
那么想想,上面的代码是否有不足之处,万一我将一坨屎作为资产呢?
这不合理吧,太恶心了,资产对象只能是有价值的东西,所以我们必须要让泛型实现一个接口
所以,经过这段分析,我们先创建一个接口Property
package com.banmoon;
/**
* 资产
*/
public interface Property {
}我们规定,人的资产必须要实现这个接口,那我们泛型Person类要如何改动呢
如下即可,只需要规定下是泛型继承自Property接口即可
package com.banmoon;
import lombok.Data;
@Data
public class Person<T extends Property> {
/**
* 姓名
*/
private String name;
/**
* 资产
*/
private T property;
}改动好了,再回过头去看看,刚刚写的代码,编辑器爆红了

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

刚刚都是属性,现在看看如何在方法中使用泛型
其实,这也非常简单,只需要在限定修饰符后加上,自己的<>符号,在当中定义自己的泛型字母后,入参中就可以使用这个泛型字母了
同样的,在方法中可以使用这个入参做出方法的逻辑动作
private <O> void showOther(O o) {
System.out.println(o.toString());
}注意一下,如果类上面有定义好泛型,方法上想要同样的的类型,就可以不用再方法上定义了
如下,我就简单写一个两个人交换资产的方法
package com.banmoon;
import lombok.Data;
@Data
public class Person<T extends Property> {
/**
* 姓名
*/
private String name;
/**
* 资产
*/
private T property;
/**
* 交换资产
*/
public void exchangeProperty(Person<T> person) {
T selfProperty = this.getProperty();
this.setProperty(person.getProperty());
person.setProperty(selfProperty);
}
}如此就完成了,两个人交换资产的方法了
我们来用一下,两个人分别有一辆车,现在需要进行兑换
package com.banmoon;
public class Main {
public static void main(String[] args) {
Person<Car> person = new Person<>();
person.setName("banmoon");
person.setProperty(new Car());
Person<Car> person1 = new Person<>();
person1.setName("banmoon1");
person1.setProperty(new Car());
person.exchangeProperty(person1);
}
}
class Car implements Property {
}但是,如果两个人是不同的资产,就不允许进行兑换了,如下

这是因为person这个对象,在实例化出来的时候,它的资产就是固定的Car,而person1的资产是Money
所以person对象的交换资产的方法,就固定死了,只能是相同有Car这个资产的人才能交换
那么,这个该如何改动呢,让他们之间的资产能够相互进行转换
其实,这也非常简单,只需要简单改动下实例化的信息即可,就像这样

刚刚将的是普通方法,考虑到与实例对象之间有联动,就显得复杂了点
那么静态方法,非常简单,定义和普通方法一样,直接在静态修饰符后添加上即可
package com.banmoon;
public class Main {
public static <O extends Property> void show(O o) {
System.out.println(o);
}
}泛型的使用就是这样,它就是为了规定其中某项元素为特定的类型,或者暂时不清楚具体的类型而定下的
上面讲解的都是单泛型,在我们自己开发的时候,一个优秀的设计往往会简约的抽象泛型,一般一个泛型即可
但是为了代码的高度复用,有些类可能会采用多个泛型来设计,这个时候看源码,我建议优先看注释,这个类是做什么的,里面的每一个泛型类分别有什么作用。
好了,希望本篇文章,对您有帮助!!!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。