泛型
1. 泛型
1.1 什么是泛型
泛型的核心是让方法能够支持更多的类型,在满足多种条件情况下,又可以严格的遵守【数据类型一致化】
格式:
<无意义单个大写英文字母占位符>
占位符 ==> 数据类型
常用泛型占位符:
<T> Type
<E> Element
<K> Key
<V> Value
<R> ReturnType
泛型操作主要涉及的内容
1. 方法使用
2. 类使用
3. 接口使用
【核心】都是为了约束方法。
1.2 泛型在方法中使用
格式:
权限修饰符 static <自定义泛型无意义单个大写字母占位符> 返回值类型 方法名(形式参数列表) {
}
【强制要求】
1. 使用泛型的XX方法,要求形式参数列表中必须有一个参数对应的当前泛型。
2. 返回值类型可以使用自定义泛型。
package com. qfedu. a;
public class Demo1 {
public static void main ( String[ ] args) {
Integer t1 = testType ( 1 ) ;
String t2 = testType ( "字符串???" ) ;
Demo1 t3 = testType ( new Demo1 ( ) ) ;
}
public static < T> T testType ( T t) {
return t;
}
}
特征:
1. 一个方法带有泛型,泛型对应的具体数据类型,是由当前方法中泛型参数来进行约束的。并且一旦确定无法更改【重
点】
2. 方法的返回值类型可以使用泛型。
3. 方法中的局部变量可以使用自定义泛型。
package com. qfedu. a;
public class Demo2 {
public static void main ( String[ ] args) {
Integer[ ] arr1 = { 1 , 2 , 3 , 4 , 5 } ;
String[ ] arr2 = { "西瓜" , "桃子" , "葡萄" , "甘蔗" , "" } ;
Float[ ] arr3 = { 1.4F , 2.5F , 3.5F } ;
printArray ( arr1) ;
System. out. println ( "--------------------------" ) ;
printArray ( arr2) ;
System. out. println ( "--------------------------" ) ;
printArray ( arr3) ;
}
public static < T> void printArray ( T[ ] arr) {
for ( int i = 0 ; i < arr. length; i++ ) {
System. out. println ( arr[ i] ) ;
}
}
}
1.3 泛型在类中使用
格式:
class 类名<自定义无意义单个大写英文字母占位符> {
类内的非静态成员方法可以使用类名声明的泛型。
【类内的非静态成员变量不建议使用泛型】
}
package com. qfedu. a;
class Type < T> {
public void test ( T t) {
System. out. println ( t. getClass ( ) ) ;
}
public T getType ( T t) {
return t;
}
public static < A> A testStatic ( A a) {
return a;
}
}
public class Demo4 {
public static void main ( String[ ] args) {
Type< String> t1 = new Type < String> ( ) ;
t1. test ( "卤煮火烧+螺蛳粉+臭豆腐+臭鳜鱼" ) ;
String string = t1. getType ( "豆汁+焦圈+煎饼果子" ) ;
Type< Integer> t2 = new Type < Integer> ( ) ;
t2. test ( 10 ) ;
int i = t2. getType ( 20 ) ;
}
}
1.4 泛型在接口中使用
格式:
interface 接口名<自定义无意义泛型单个大写英文字母占位符> {
接口中的成员变量无法使用接口声明的泛型,因为接口中的成员变量缺省属性 public static final
要求定义时必须初始化!!!泛型在没有约束具体数据类型之前,无法明确类型,无法进行对应的赋值操作。
接口中的成员方法 缺省类型 public abstract
}
package com. qfedu. a;
interface A < T> {
void test ( T t) ;
default public T getType ( T t) {
return t;
}
}
class TypeFreedom < T> implements A < T> {
@Override
public void test ( T t) {
System. out. println ( t. getClass ( ) ) ;
}
}
class TypeRakeEars implements A < String> {
@Override
public void test ( String t) {
System. out. println ( "当前泛型对应具体数据类型已明确为 String类型" ) ;
}
}
public class Demo5 {
public static void main ( String[ ] args) {
TypeFreedom< Integer> t1 = new TypeFreedom < Integer> ( ) ;
t1. test ( 10 ) ;
Integer integer = t1. getType ( 100 ) ;
TypeFreedom< Demo5> t2 = new TypeFreedom < Demo5> ( ) ;
t2. test ( new Demo5 ( ) ) ;
Demo5 type = t2. getType ( new Demo5 ( ) ) ;
TypeRakeEars 妻管严 = new TypeRakeEars ( ) ;
妻管严. test ( "让你往东,就必须往东!!!" ) ;
String type2 = 妻管严. getType ( "在遵从接口时明确当前泛型为字符串" ) ;
}
}