您的位置:首页 > 汽车 > 新车 > Java 泛型

Java 泛型

2024/7/2 4:41:13 来源:https://blog.csdn.net/jiezheee/article/details/139633545  浏览:    关键词:Java 泛型

一,3种泛型方式:泛型类、泛型接口、泛型方法


泛型类

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{private T key;public Generic(T key) {this.key = key;}public T getKey(){return key;}
}

泛型接口

public interface Generator<T> {public T next();
}// 实现泛型接口时,可以传入或者不传实际类型:
public class FruitGenerator<T> implements Generator<T>
public class FruitGenerator implements Generator<String>

泛型方法

// 只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法
// 此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
public <T> T genericMethod(Class<T> tClass) {T instance = tClass.newInstance();return instance;
}
  • 静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 
public class StaticGenerator<T> {public static <T> void show(T t){}
}
  • 泛型方法中添加上下边界的时候,必须在权限声明与返回值之间的<T>上添加上下边界,即在泛型声明的时候添加。
// 编译器会报错
public <T> T showKeyName(Generic<T extends Number> container)public <T extends Number> T showKeyName(Generic<T> container){System.out.println("container key :" + container.getKey());T test = container.getKey();return test;
}

二,Tips


1,类型擦除:泛型类型只在编译阶段有效。
2,不能创建一个确切类型的泛型数组,而使用通配符?是可以的。
  • [❌] List<String>[] ls = new ArrayList<String>[10]
  • [✅] List<?>[] ls = new ArrayList<?>[10];
  • [✅] List<String>[] ls = new ArrayList[10];
3,无法对泛型代码直接使用 instanceof 关键字,而使用通配符?是可以的。
  • [❌] list   instanceof   ArrayList<Integer>
  • [✅]  list instanceof ArrayList<?>
4,注意两种继承情况
① 第一种
public void showKeyValue(Generic<Number> obj){Log.d("泛型测试","key value is " + obj.getKey());
}Generic<Integer> gInteger = new Generic<Integer>(123);
Generic<Number> gNumber = new Generic<Number>(456);[✅] showKeyValue(gNumber);
[❌] showKeyValue(gInteger); //编译报错
② 第二种
class Fruit {@Overridepublic String toString() {return "fruit";}
}class Apple extends Fruit {@Overridepublic String toString() {return "apple";}
}class GenerateTest<T> {public void show_1(T t) {System.out.println(t.toString());}
}public static void main(String[] args) {Apple apple = new Apple();GenerateTest<Fruit> generateTest = new GenerateTest<Fruit>();//apple是Fruit的子类,所以这里可以[✅]generateTest.show_1(apple);
}    

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com