(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.打赏鼓励
感谢您的细心阅读,您的鼓励是我写作的不竭动力!!!