Java:泛型

泛型

使用泛型

List<String> strList = new ArrayList<>();
这个List集合只能保存字符串对象,不能保存其他类型的对象。

菱形语法

Java7开始,Java允许在构造器后不需要带完整的泛型类型。只要<>即可。
List<String> strList = new ArrayList<>();
Map<String , Integer scores = new HashMap<>();

深入泛型

泛型允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定。

List接口代码片段

public interface List<E>{
	void add(E x);
	Iterator<E> iterator();
	...
}

实例:使用泛型声明的Apple类

public class Apple<T>{
	private T info;
	public Apple(){}
	public Apple(T info){
		this.info = info;
	}
	
	public void setInfo(T info){
		this.info = info;
	}
	public T getInfo(){
		return this.info;
	}
	
	public static void main(String[] args){
		Apple<String> a1 = new Apple<>("苹果");
		System.out.println(a1.getInfo());
		
		Apple<Double> 2 = new Apple<>(5.67);
		System.out.println(2.getInfo());
	}
}

重写父类方法

public class A2 extends Apple{
	public String getInfo(){
		return super.getInfo().toString();
	}
}

泛型类的关系

List<String> l1 = new ArrayList<>();
List<String> l2 = new ArrayList<>();
System.out.println(l1.getClass() == l2.getClass());//true

1.不管泛型的实际参数是什么,它们在运行时总有相同的类。
2.不管为泛型的类型形参传入哪一种类型实参,对于Java来说,它们依然被当成同一个类处理,在内存中也只占用一块内存空间,因此在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。如static T info
3.由于系统中并不会真正生成泛型类,所以instanceof运算符后不能使用泛型类,例如if (cs instanceof List<String>) {...}


注意:
数组和泛型有所不同,假设Foo是Bar的一个子类型(子类或者子接口),那么Foo[]依然是Bar[]的子类型;但G不是G的子类型。


泛型高级用法

限制泛型类型

class ClassName<T extendes anyClass>

使用类型通配符

List<?> 它的元素可以匹配任何类型。
这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素加入到其中。

上一篇:Java对象类型向上转型和向下转型


下一篇:Xcode 沙盒选项