【01】Java泛型基础

(1)一个人只要自己不放弃自己,整个世界也不会放弃你.
(2)天生我才必有大用
(3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟.
(4)做难事必有所得
(5)精神乃真正的刀锋
(6)战胜对手有两次,第一次在内心中.
(7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

Java泛型基础

1.使用泛型的好处是什么?

(1)在编译的过程中就可以知道使用什么类型,而不需要等到运行的时候使用什么类型。即可以将运行期类型转换错误提前到编译期处理。

(2)从泛型中取数据的时候不再需要强制类型转换。

2.泛型有哪几种形式?

2.1泛型接口

2.1.1泛型接口如何定义?
public interface Plate<T> {
	public void set(T t);
	public T get();	
}
1)在接口名后加上<T>

2.2泛型类

2.2.1泛型类如何定义?
package com.generics.demo01.plate;

import java.util.ArrayList;
import java.util.List;

public class AIPlate<T> implements Plate<T> {

	private List<T> items = new ArrayList<T>(10);

	public AIPlate() {

	}

	public AIPlate(T t) {
		items.add(t);
	}

	@Override
	public void set(T t) {
		items.add(t);
	}

	@Override
	public T get() {
		int index = items.size() - 1;
		if (index >= 0) {
			return items.get(index);
		} else {
			return null;
		}
	}
}
(1)在类名后面加上<T>

2.3泛型方法

2.3.1泛型方法如何定义?
	public <T> AIPlate<T> getAIPlate() {
		return new AIPlate<T>();
	}
1)在访问修饰符与返回类型之间加个<T>

3.泛型定义需要注意的几点

3.1泛型方法与普通方法的区别

(1)以下方法只是一个普通的方法,只是使用了泛型类型做形参,并不是一个泛型方法,要加以区别。

    public void addFruitToAi(AIPlate<Banana> aiPlate){
		//s1.使用了泛型之后,此处无法再装苹果
		//aiPlate.set(new Apple());
		//s2.在编译的时候就会出错
		aiPlate.set(new Banana());
	}

3.2泛型类定义的时候需要注意的问题

(1)如果一个类继承自一个泛型类,继承的泛型类中已经明确的说明了泛型中存放的是什么类型,那么在声明当前类时,可以省略类名后面的。

package com.generics.demo01.plate;

import com.generics.demo01.fruit.Apple;

public class Plate1 implements Plate<Apple> {
	@Override
	public void set(Apple t) {
		
	}

	@Override
	public Apple get() {
		return null;
	}
}

3.3泛型限定的时候需要注意的问题

(1)如果需要限定同时满足几个条件,类要写在前面,而接口要写在后面,否则编译会报错。
(2)泛型在定义类型时,同时限定该类型满足几个条件,可以用&进行连接条件。
(3)示例如下:

public class Test1 {

	static class A {
	}

	static class A1 {
	}

	static interface B {

	}

	static interface C {

	}
	
	/*
	 * s1.编译报错
	 * 当限制有几个的时候,类要写在前面,如果把接口写在前面的话,就会报错
	 */
	//static class D<T extends B & A & C> {}
	
	//s2.正确写法
	static class D<T extends A & B & C> {}
}

3.3单继承引起的问题

(1)如果定义泛型类的时候,在限定的条件中出现了多个类,这是不允许的,因为Java是单继承的,所以编译时会报错。
(2)示例代码如下:

public class Test2 {
	static class A {
	}

	static class A1 {
	}

	static interface B {

	}

	static interface C {

	}
	
	/*
	 * s1.如果有两个实现类的时候,这样就没办法做了,为什么?
	 * 因为Java里面是单继承的,只能继承自一个类,可以实现多个接口,但是只能继承一个类。
	 */
	//static class D2<T extends A & A1 & B & C>{}
}

4.泛型基础小结

4.1什么是泛型?

(1)Java泛型(generics)是JDK5中引入的一种参数化类型特性。

4.1.1什么是参数化类型

(1)把类型当参数一样传递
(2)<数据类型>只能是引用类型(泛型的副作用)
举个例子:

(a)Plate<T> 中的“T”称为类型参数
(b)Plate<Banana>中的"Banana"称为实际类型参数
(c)Plate<T>整个成为泛型类型
(d)Plate<Banana>整个称为参数化 的类型ParameterizedType

4.2为什么使用泛型,使用泛型的好处是什么?

(1)使代码更健壮,只要编译期没有警告,那么运行期就不会出现ClassCastException.
(2)使代码更简洁,不用强制转换。
(3)代码更灵活,复用。
示例1:
在这里插入图片描述

(a)多种排序方法,每一种数据类型都需要进行排序,都需要增加一个排序方法。明明功能是相似的,但是需要写很多代码。
(b)当使用泛型之后,无论是int,double都能够进行排序,这就是泛型能够让我们的代码更灵活,能够复用。
示例2:List中的sort方法,只要是实现了Comparator接口的类,都可以使用如下图所示的sort方法,即一个方法搞定所有的排序,体现代码的灵活性与复用性。
在这里插入图片描述

5.打赏鼓励

感谢您的细心阅读,您的鼓励是我写作的不竭动力!!!

5.1微信打赏

在这里插入图片描述

5.2支付宝打赏

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值