类型参数化。可以简化类型转化,所有的类型转化均是隐式的。将类型的转换从运行时转到编译期。
泛型T跟在类声明的后面<T>,T在类对象生成时被确定。以后T全部被替换为对象生成时的类型。
如:List<String>和List<Integer>在运行事实上是相同的类型。他们都被擦除成他们的原生类型,即List。
通常来说,如果Foo是Bar的子类型,G是一种带泛型的类型,则G<Foo>不是G<Bar>的子类型。
泛型处理必须的类的类型,不能处理基本类型。
不能在static类中使用泛型:因为泛型是在实例化时确定的(new)。
不能在catch内使用泛型。
类型边界:
当在类中计算诸如求和,平均值等多个泛型值时,不是全部的类型都能做求和,平均的,故引用类型边界。
public class Averge<? extends Number>这样?就可以计算了。---类型右边界
当没有指定泛型继承的类型或接口时,默认使用? extends Object,所以默认情况下任何类型都可以作为参数传入。
泛型通配符:
通配符范围是为了给当前泛型做约束的,约束以后的泛型就具备了运算能力。若不对泛型做约束,范型类/方法只能做简单的get,set等操作,不能具备比较,计算的条件,因为在泛型类未确定的时候,不能确定该类到底可以做哪些事。
类型<?> 即 Averge<?> 表示任何的Averge对象。Averge<?> 包括Averge<Integer>,Averge<String>,Averge<Object>的父类。
List<?>:是可以读的,因为list中确实有元素,但是不能add,因为不知道元素类型,不能运算。
<?extends SomeClass>是一个限界通配符(boundedwildcard),?代表了一个未知的类型,并且它是SomeClass的子类,也可以是SomeClass本身。
泛型方法:
在非泛型类中可以有泛型方法;
修饰符 方法类型<参数类型列表> 返回值类型 方法名(参数列表) {}
泛型类继承:
声明泛型子类时必须包含其父类的类型参数。
父类是泛型类,子类必须是泛型类。