1.简单的泛型接口:
当指定泛型类时,类的声明则包含一个或多个类型参数,这些参数被放在类名后面的一对中括号内,也可以声明接口是泛型的。
public class test3<AnyType> {
private AnyType memeber;
public AnyType read(){
return this.memeber;
}
public void write(AnyType member){
this.memeber = member;
}
public static void main(String[] args) {
test3<String> t = new test3<String>(); //这里可以简化为 菱形运算符 java7新增特性 即:
//test3<String> t = new test3<>();
t.write("ABCD");
System.out.println("--->"+(String)t.read());
}
}
2.自动拆装箱:
例如,一个int类型被传递到需要一个Integer对象的地方,那么编译器将在幕后插入一个对Integer构造方法的调用,这种就叫做“自动装箱”,而相反,如果一个Integer对象被放到需要int类型的地方,则编辑器将在幕后插入一个对intValue方法的调用,则这种就叫做“自动拆箱”,对于基本数据类型都会有自动拆装/封装的情形。
3.带有限制的通配符
假设有一基类Shape,该类含有totleAreaCol方法,用于计算总面积。有两个子类分别为:Circle类和Square类 分别继承Shape。设想该父类Shape中的totleAreaCol方法参数如何泛型,才能实现可以接收通用的参数呢?可想而知 public static double totleAreaCol(Collection<Shape> arr)则这种泛型是不可取的,这时候我们可以利用带有限制的通配符来实现。
public class Shape{
public double totleAreaCol(Collection<? extends Shape> arr){ //泛型了方法
// 利用?通配符,来继承Shape,这样子类都可以作为参数传入了
double totle = 0;
for(Shape s:arr){
totle = totle + s.getMyArea();
}
return totle;
}
}
4.显示泛型方法
需要特定类型参数的泛型方法,则需要显示泛型来进行声明,声明方式为:在方法的返回类型之前使用
<参数类型> 来进行声明;
特定类型的参数表可以理解三方面:1)该特定类型作为返回值 2) 该特定类型用在多于一个的参数类型中 3) 改类型用于声明一个局部标量。所以如果需要上诉三个要求那么就可以考虑使用显示泛型方法来实现泛型啦。
//显示泛型方法
public class test5 {
public <AnyType> boolean contains(AnyType[] arr,AnyType x){
for(AnyType val:arr){
if(val.equals(x)){
return true;
}
}
return false;
}
}
//显示泛型static方法
public class test5 {
public static<AnyType> boolean contains(AnyType[] arr,AnyType x){
for(AnyType val:arr){
if(val.equals(x)){
return true;
}
}
return false;
}
}
5.类型限制
public <AnyType> AnyType findMax(AnyType[] arr){
int maxIndex = 0;
for(int i=0;i<arr.length-1;i++){
if(arr[i].compareTo(arr[maxIndex])>0){ //这一行我们会发现编译不过
maxIndex = i;
}
}
return arr[maxIndex];
}
上诉代码我们会发现第四行是编译不过的,原因是只有在AnyType是Comparable的情况下才能保证compareTo存在,此时程序不能保证AnyType类型的参数是实现了Comparable的。
所有可以通过“类型界限”解决这个问题,在显示泛型中声明 实现Comparable接口。如下代码:
public <AnyType extends Comparable> AnyType findMax(AnyType[] arr){
... ...
}
但考虑到Comparable接口是是需要泛型的,所有应该进一步改写为如下代码:
public <AnyType extends Comparable<AnyType>> AnyType findMax(AnyType[] arr){
... ...
}
到这里我们的类型限制做的还不够完美,我们举一个"栗子",Comparable,Shape,Square这三者的关系:Square类 ---继承---> Shape类 ---实现--->Comparable接口;
从而推出来: Square IS-A Comparable<Shape>;从而我们可以推测 AnyType所继承的Comparable所需要泛型的类型是AnyType的父类。
public <AnyType extends Comparable<? super AnyType>> AnyType findMax(AnyType[] arr){
... ...
}
上述为个人学习时的总结,如有错误还请多多指教~