首页 > 代码库 > java泛型 之 入门(interface)
java泛型 之 入门(interface)
一:泛型简介:
(1)所谓泛型,就是变量类型的参数化。
泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。使用泛型时如果不指明参数类型,即泛型类没有参数化,会提示警告,此时类型为Object。
(2)为什么使用泛型
使用泛型的典型例子,是在集合中的泛型使用。如果不使用泛型,存入集合中的元素可以是任何类型的,当从集合中取出时,所有的元素都是Object类型,需要进行向下的强制类型转换,转换到特定的类型。
比如:List myIntList = new LinkedList(); // 1
myIntList.add(new Integer(0)); // 2
Integer x = (Integer) myIntList.iterator().next(); // 3
第三行的这个强制类型转换可能会引起运行时的错误。
泛型的思想就是由程序员指定类型,这样集合就只能容纳该类型的元素。
使用泛型:
List<Integer> myIntList = new LinkedList<Integer>(); // 1‘
myIntList.add(new Integer(0)); // 2‘
Integer x = myIntList.iterator().next(); // 3‘
将第三行的强制类型转换变为了第一行的List类型说明,编译器会为我们检查类型的正确性。这样,代码的可读性和健壮性也会增强。
(3)泛型使用基础
public interface List <E> {
void add(E x);
Iterator<E> iterator();
}
public interface Iterator<E> {
E next();
boolean hasNext();
}
尖括号中包含的是形式类型参数(formal type parameters),它们就如同一般的类型一样,可以在整个类的声明中被使用。当类被使用时,会使用具体的实际类型参数(actual type argument)代替。比如前面的例子中的List<Integer>,那么所有的E将会被Integer类型所代替。
泛型类型参数只能被类或接口类型赋值,不能被原生数据类型赋值,原生数据类型需要使用对应的包装类。
形式类型参数的命名:尽量使用单个的大写字母(有时候多个泛型类型时会加上数字,比如T1,T2),比如许多容器集合使用E,代表element(元素),Map中用K代表键keys,V代表值。
二 实际应用:
(1) 创建接口ParentInterface 的java文件
package edu.tju.cs; public interface ParentInterface<T1,T2>{ public void setFoo1(T1 foo1); public void setFoo2(T2 foo2); public T1 getFoo1(); public T2 getFoo2(); }
(2) 创建实现类ChildClass的java文件
package edu.tju.cs; public class ChildClass<T1,T2> implements ParentInterface<T1, T2>{ private T1 foo1; private T2 foo2; @Override public void setFoo1(T1 foo1){ this.foo1 = foo1; } @Override public void setFoo2(T2 foo2){ this.foo2 = foo2; } @Override public T1 getFoo1(){ return this.foo1; } @Override public T2 getFoo2(){ return this.foo2; } public static void main(String[] args) { ChildClass<String,String> cc = new ChildClass<String,String>(); cc.setFoo1("徐勤柱"); cc.setFoo2("王昭娴"); System.out.println("get() " + cc.getFoo1()); System.out.println("get() " + cc.getFoo2()); ChildClass<Integer,String> cc2 = new ChildClass<Integer,String>(); cc2.setFoo1(123); cc2.setFoo2("吴明静"); System.out.println("get() " + cc2.getFoo1()); System.out.println("get() " + cc2.getFoo2()); ChildClass<String,Number> cc3 = new ChildClass<String,Number>(); cc3.setFoo1("申佳维"); cc3.setFoo2(123.4556); System.out.println("get() " + cc3.getFoo1()); System.out.println("get() " + cc3.getFoo2()); } }
三 学习心得:
(1)java 泛型不可以有基本类型
List<int> list=new ArrayList<int>();//这里,这样是错误的
list.add(0);
list.add(1);
这是因为:泛形要求能包容的是对象类型,而基本类型在java里不属于对象。但是基本类型都有其包装类型,也就是对象类型:
int->Integer
long->Long
....
那么你要想存放基本类型就用其包装类型去实现功能:
List<Integer> list=new ArrayList<Integer>();
list.add(0);
list.add(1);
总之一句话,泛型里面可以放<integer> ,<character>;int,char 基本类型是不可以的。泛型里面是可以放引用类型的,比如放个对象类型。<User>.
http://docs.oracle.com/javase/tutorial/extra/generics/simple.html
java泛型 之 入门(interface)