-
Java基础之:自定义泛型
自定义泛型的细节:
-
普通成员可以使用泛型(属性与方法)
-
使用泛型的数组不可初始化
-
静态方法中不可使用类的泛型
-
泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
-
如果在创建对象时,没有指定类型,默认为Object
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package class_Generic_custom; public class ClassTest01_customGeneric { public static void main(String[] args) { //可以在自定义类或接口中使用泛型 AA<String> a = new AA<>( "hi" ); a.say(); //String //这里使用Integer,而不是int。因为泛型接收传入的类型只能是引用类型。 AA<Integer> b = new AA<>( 123 ); b.say(); //Integer } } class AA<T>{ //泛型一般使用T来表示,type。 private T t; //创建T类型的属性 t public void say() { System.out.println(t.getClass()); //返回t的类型 } public AA(T t) { this .t = t; } } class BB<E,T>{ //泛型可以有多个 E e; T t; // public static E es;//泛型不可以使用static修饰,因为泛型是在创建对象是传入的。 //使用泛型的数组,不能初始化 E[] eArr /*= new E[6]*/ ; //报错:Cannot create a generic array of E public void seteArr(E[] arr) { //使用set方法传入参数来定义泛型数组,或构造器 eArr = arr; } //静态方法中不能使用类的泛型 // public static void show(E e) { //报错:Cannot make a static reference to the non-static type E //静态方法使用时,可能并没有创建对象,那么e的类型也无法确定 // } } |
自定义泛型接口
-
接口中,静态成员也不能使用泛型(这个和泛型类规定一样)
-
泛型接口的类型, 在接口被扩展时(即:被继承或者实现) 会确定 [后面举例]
-
没有指定类型,默认为Object [后面举例]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package class_Generic_custom; public class ClassTest04_GenericInterface { public static void main(String[] args) { } } //自定义泛型接口 interface IA<T>{ public T show(); //返回T类型的数据 } //若有类实现了泛型接口,那么在继承的时候 就需要指定泛型。 class IIAA implements IA<String>{ @Override public String show() { return "IIAA" ; } } //若有类实现了泛型接口,但此类本身也时泛型类,可以在创建类时不指定接口的泛型。 //将类的泛型传递给接口。 class BBB<E> implements IA<E>{ @Override public E show() { return null ; } } class CC<K>{ } //若既继承了泛型父类,又实现了泛型接口,可以分别为它们传递泛型 //也可以像上面一样使用一个泛型,传递给它们。 class DD<E,T,V> extends CC<E> implements IA<T>{ @Override public T show() { return null ; } } |
自定义泛型方法
1) 泛型方法,可以定义在普通类中, 也可以定义在泛型类中
2) 当泛型方法被调用时,类型会确定.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package class_Generic_custom; public class ClassTest03_GenericMethods { public static void main(String[] args) { MM<String> m = new MM<>(); m.show( 123 ); //Integer m.say( new Object()); //Object } } class MM<T>{ //自定义泛型方法 public <E> void show(E e) { System.out.println(e.getClass()); //返回E,即E是什么类型传入,那么输出就是什么类型 } //当泛型类与自定义泛型方法使用的泛型重名时,采用就近原则 public <T> void say(T t) { System.out.println(t.getClass()); } } |
泛型的继承和通配符
说明
1.泛型不具有继承性,例如:
List<Object> list = new ArrayList<String>(); //×
2.<?>:表示支持任意泛型类型
3.<? extends A>:表示支持A类以及A类的子类,规定了泛型的上限
4.<? super A>:表示支持支持A类以及A类的父类,不限于直接父类,规定了泛型的下限。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package class_Generic_custom; import java.util.ArrayList; public class ClassTest02_ExtendsGeneric { public static void main(String[] args) { // 泛型不具备继承性 // ArrayList<Object> list = new ArrayList<String>(); ArrayList<Object> list1 = new ArrayList<>(); ArrayList<String> list2 = new ArrayList<>(); ArrayList<Grandpa> list3 = new ArrayList<>(); ArrayList<Father> list4 = new ArrayList<>(); ArrayList<Son> list5 = new ArrayList<>(); // print(list1);//X //Object 不属于 Father及其子类 // print(list2);//X //String 不属于 Father及其子类 // print(list3);//X //Grandpa 属于 Father 父类 // print(list4);//√ // print(list5);//√ // print2(list1);//√ // print2(list2);//X //String 不属于 Father及其父类 // print2(list3);//√ // print2(list4);//√ // print2(list5);//X //Son 属于 Father子类 // print3(list1);//√ // print3(list2);//√ // print3(list3);//√ // print3(list4);//√ // print3(list5);//√ } public static void print(ArrayList<? extends Father> e) { } public static void print2(ArrayList<? super Father> e) { } public static void print3(ArrayList<?> e) { } } class Grandpa{ public void hi() { System.out.println( "hi~" ); } } class Father extends Grandpa{ public void hello() { System.out.println( "hello~" ); } } class Son extends Father{ public void show() { System.out.println( "show~" ); } } |
来源:https://www.cnblogs.com/SongHai/p/14351871.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数