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

[Java]泛型方法思路整理

2016-01-23 22:46 417 查看
[泛型小结]小的开始学习Java,前几天遇到一题,一时没搞清楚,经过几番思量,终于看明白,今整理如下,就当做了一个笔记,如有整理的有什么不周之处,还请各位指点一二,在此先这么谢过了…

泛型:

* 概述: 是一种把类型的明确工作推迟到了创建对象获取调用方法的时候的一种特殊的类型 , 属于参数化类型

* 格式: <数据类型1 , 数据类型2 ,…>

* 注意: 数据类型只能是引用数据类型

* 自定义泛型(暂时没有将泛型构造器写进去)

/**

* 泛型的分类:

* ** 自定义泛型类 public class 类名<泛型>{}

* ** 自定义泛型接口 public interface 接口名<泛型> {}

* ** 自定义泛型方法 修饰符 <泛型> 返回值类型 方法名(数据类型 变量名) {…}

* ** 自定义泛型集合 接口类型 <泛型> 接口名=new 接口类型 <泛型>();

* [这里的泛型在创建集合时应该 给出具体的数据类型,这里只是概括一下]

*

* 泛型通配符

*

* ? 表示任意的类型

* ? extends E 向下限定 , 表示的是E或者E的子类

* ? super E 向上限定 , 表示的是E或者E的父类

*/

## 小记 ##

无论泛型是何种形式,其作用根本还是体现在类或方法或集合的参数上,把握这一点即可

需求

需求如下:

//需求:定义一个方法,该方法用于打印出任意参数化类型的集合中的所有数据

public static void printCollection (Collection<Object> cols) {
for (Object obj : cols) {
System.out.println( obj );
}
}


验证

首先给出一个集合,如下:

package homework.test2;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class Test2 {
public static void main(String[] args) {
List<String> l = new ArrayList<String>();
ArrayList<String> l1 = new ArrayList<String>();
l.add("abc");
l.add("123");
l.add("小阎");
System.out.println(l1.toString());
System.out.println(l1);
//ArrayList里本身没有toString,它继承AbstractCollection<E>里的toString(),
//而AbstractCollection<E>父类是List类,List类的toString继承的是Object里的toString,输出的是地址和哈希码值
printCollection(l);
}


第一种方法:利用多态的特性,但上面已经给出泛型,下面最好也指定泛型(属于多态的应用)

public static void printCollection(Collection cols) {
for (Object obj : cols) {
System.out.println(obj);
}
}


第二种方法:利用向下限定(属于泛型通配符)

public static void printCollection(Collection<?> cols) {
for (Object obj : cols) {
System.out.println(obj);
}
}


这里,形参Collection

public static void printCollection(Collection<E> cols) {
for (E e : cols) {
System.out.println(e);
}
}


但,由于该方法用到了泛型,所以这个方法敢得定义成泛型方法,正确方法如下

public static <E> void printCollection(Collection<E> cols) {
for (E e : cols) {
System.out.println(e);
}
}


注意:由于在这里泛型只能用于引用数据类型,所以这里可以用最顶层类Object代替泛型来接收,类似于第二种方法

public static <E> void printCollection(Collection<E> cols) {
for (Object obj : cols) {
System.out.println(obj);
}
}


但,这里如果不用泛型或最顶层类Object类来接收,而用其它类如Integer,则违背泛型原本的意义,编译报类型不匹配错误

public static <E> void printCollection(Collection<E> cols) {
for (Integer obj : cols) {
// Type mismatch: cannot convert from element type E to Integer
// 类型不匹配:不能从元素类型E转换为整数
System.out.println(obj);
}
}


## 小记 ##

最后小记心得:无论泛型是何种形式,其作用根本还是体现在类或方法或集合的参数上,把握这一点即可

::::::小编刚学JavaSE,如下什么地方表达不准确或有误,欢迎大家监督、批评指正,在些先谢过了~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: