JAVA泛型
Why
不使用范型带来的危害:当我们将一个对象放入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,改对象的编译类型变成了Object类型,但其运行时类型任然为其本身类型。取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现“java.lang.ClassCastException”异常。
范型可以提供编译时类型安全监测机制。
What
泛型,即“参数化类型”, 类似于方法中的变量参数。定义方法时有形参,然后调用此方法时传递实参。
- 泛型只在编译阶段有效.
- 泛型的类型参数只能是类类型,不能是简单类型。
How
- 泛型类:
/*
* 泛型类
* Java库中 E表示集合的元素类型,K 和 V分别表示表的关键字与值的类型
* T(需要时还可以用临近的字母 U 和 S)表示“任意类型”
*/
public class Pair<T> {}
- 泛型接口
public interface Generator<T> {}
- 泛型方法
public static <T> T getMiddle(T a) {}
- 通配符: 解决当具体类型不确定的时候,这个通配符就是 ? ;当操作类型时,不需要使用类型的具体功能时,只使用Object类中的功能。那么可以用 ? 通配符来表未知类型。
ArrayList heroList<? extends Hero>
ArrayList heroList<? super Hero>
ArrayList list<?>
实际使用
为了将reader中已有的方法暴露给plugin package使用,引入了sdk package。在sdk package中定义 IPosition interface,采用泛型类,降低reader的修改范围。
Reader:
public interface Element extends IElements<Position> {
public Position getStartPosition();
}
SDK:
public interface IElement<T extends IPosition> {
public T getStartPosition();
}