您的位置:首页 > 编程语言 > Java开发

【javase复习】## day8 泛型 ##

2016-08-03 20:24 525 查看
为什么要运用泛型:

将运行时的异常提前到编译时。

避免了多余的强制转型。

JDK1.5之后才有

泛型在集合中的常见应用:

ArrayList<String>  list = new ArrayList<String>();  true     推荐使用。

ArrayList<Object>  list = new ArrayList<String>();  false
ArrayList<String>  list = new ArrayList<Object>();  false

//以下两种写法主要是为了兼顾新老系统的兼用性问题。
*
ArrayList<String>  list = new ArrayList();           true

ArrayList    list = new ArrayList<String>();   true


注意: 泛型没有多态的概念,左右两边的数据 类型必须 要一致,或者只是写一边的泛型类型。 要用包装类!!!!

推荐使用: 两边都写泛型。

一边写泛型另一边不写也语法正确是为了照顾新老系统的兼容【假设有JDK1.5之前版本写的工具类返回一个不带泛型的容器或者需要的参数是不带泛型的,依然可以将带泛型的传进去使用。】

———–在方法上使用泛型

public class rrr {
public static void main(String[] args) {
String str = rrr.get("sb");
System.out.println(str);
}

public static <QQ>QQ get(QQ o){
return o;
}
}


注意方法的返回值是在传入实参的时候确定的。

注意, 返回值前面的只是一个占位符, 说明这个方法需要用到泛型QQ。可以是返回值或者是实参之一是QQ类型。

——— 泛型类!!!!!

创建对象的时候确定泛型的类型。

所以不能作用于静态方法!!!!,如果静态方法也要用泛型,则要自己定义方法上的泛型!!!!!

class MyArrays<T>{

//元素翻转
public void reverse(T[] arr){
for(int startIndex = 0, endIndex = arr.length-1 ; startIndex<endIndex ; startIndex++,endIndex--){
T temp  = arr[startIndex];
arr[startIndex] = arr[endIndex];
arr[endIndex] = temp;
}

}

//
public String toString(T[] arr){
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < arr.length ; i++){
if(i==0){
sb.append("["+arr[i]+",");
}else if(i==arr.length-1){
sb.append(arr[i]+"]");
}else{
sb.append(arr[i]+",");
}
}
return sb.toString();
}

public static <T>void print(T[] t){

}

}

public class Demo3 {

public static void main(String[] args) {
Integer[] arr = {10,12,14,19};

MyArrays<Integer> tool = new MyArrays<Integer>();//这里确定了泛型类型就是Integer类!!!!!!
tool.reverse(arr);
System.out.println("数组的元素:"+tool.toString(arr));

MyArrays<String> tool2 = new MyArrays<String>();
String[] arr2 = {"aaa","bbb","ccc"};
tool2.reverse(arr2);
MyArrays tool3 = new MyArrays();//不指定泛型则默认为Object类型!!!!!

ArrayList<String> list = new ArrayList<String>();

}


##——— 泛型接口!!!!! ##

泛型接口的定义格式:

interface 接口名<声明自定义泛型>{

}


泛型接口要注意的事项:

1. 接口上自定义的泛型的具体数据类型是在实现一个接口的时候指定 的。

2. 在接口上自定义的泛型如果在实现接口的时候没有指定具体的数据类型,那么默认为Object类型。

interface Dao<T>{

public void add(T t);
}

public class Demo implements Dao<String> {
public static void main(String[] args){

}

public void add(String str){}//上面实现的时候指定了String 所以重写只能是String类型,如果没有指定的话默认Object类型!!
}


如果实现一个接口的时候,还不明确我目前要操作的数据类型,要等待创建接口实现类 对象的时候我才能指定泛型的具体数据类型。

则要在类上声明泛型。

interface Dao<T>{

public void add(T t);
}

public class Demo4<T> implements Dao<T> {

public static void main(String[] args) {
Demo4<String> d = new Demo4<String>();//实现的时候没有指定具体泛型,到创建对象的时候才指定!!!!
}

public void add(T t){

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: