一,3种泛型方式:泛型类、泛型接口、泛型方法
泛型类
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class Generic{ private T key; public Generic(T key) { this.key = key; } public T getKey(){ return key; } }
泛型接口
public interface Generator{ public T next(); } // 实现泛型接口时,可以传入或者不传实际类型: public class FruitGenerator implements Generator public class FruitGenerator implements Generator
泛型方法
// 只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法 // 此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 public T genericMethod(Class tClass) { T instance = tClass.newInstance(); return instance; }
-
静态方法要使用泛型的话,必须将静态方法也定义成泛型方法
public class StaticGenerator
{ public static void show(T t){ } } - 泛型方法中添加上下边界的时候,必须在权限声明与返回值之间的
上添加上下边界,即在泛型声明的时候添加。 // 编译器会报错 public
T showKeyName(Generic container) public T showKeyName(Generic container){ System.out.println("container key :" + container.getKey()); T test = container.getKey(); return test; } 二,Tips
1,类型擦除:泛型类型只在编译阶段有效。 2,不能创建一个确切类型的泛型数组,而使用通配符?是可以的。-
[❌] List
[] ls = new ArrayList [10] - [✅] List>[] ls = new ArrayList>[10];
-
[✅] List
[] ls = new ArrayList[10]; 3,无法对泛型代码直接使用 instanceof 关键字,而使用通配符?是可以的。 -
[❌]
list
instanceof
ArrayList
-
[✅]
list
instanceof
ArrayList>
4,注意两种继承情况
① 第一种
public void showKeyValue(Generic
② 第二种obj){ Log.d("泛型测试","key value is " + obj.getKey()); } Generic gInteger = new Generic (123); Generic gNumber = new Generic (456); [✅] showKeyValue(gNumber); [❌] showKeyValue(gInteger); //编译报错 class Fruit { @Override public String toString() { return "fruit"; } } class Apple extends Fruit { @Override public String toString() { return "apple"; } } class GenerateTest
{ public void show_1(T t) { System.out.println(t.toString()); } } public static void main(String[] args) { Apple apple = new Apple(); GenerateTest generateTest = new GenerateTest (); //apple是Fruit的子类,所以这里可以 [✅]generateTest.show_1(apple); }
-
[❌]
list
instanceof
ArrayList
-
[❌] List
- 泛型方法中添加上下边界的时候,必须在权限声明与返回值之间的
还没有评论,来说两句吧...