一,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 {
@Override
public String toString() {
return "fruit";
}
}
class Apple extends Fruit {
@Override
public 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);
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Java 泛型
发表评论 取消回复