Java 泛型 Java generic,
Java 泛型 Java generic,
泛型(generic)是指参数化类型的能力。可以定义带泛型类型的类或方法,随后编译器会用具体的类型来代替它。例如,可以定义一个泛型栈类,它存储的是泛型元素。可以从这个泛型类生成一个包含字符串的栈对象和一个包含数字的桟对象。这里字符串和数字都是替代泛型的具体类型。
使用泛型的主要优点是能够在编译时而不是运行时检测出错误。泛型类或方法允许用户指定可以和这些类或方法一起工作的对象类型。如果试图使用一个相容的对象,编译器就会检测到这个错误。
JDK1.5以前
package java.long
public interface Comparable {
public int compareTo(Object o);
}
JDK1.5
package java.long
public interface Comparable<T> {
public int compareTo(T o);
}
泛型的类型必需是引用类型。不能像int、double或char这样的基本类型来替换泛型类型。
例如这是错误的
ArrayList<int> intlist = new ArrayList<int>();
一定要是
ArrayList<Integer> intlist = new ArrayList<Integer>();
定义类 GeomtricStack<T>
定义方法 <E> void max (E o1, Eo2)
泛型类的构造方法:
public GenericStack<E>() //这是错误的
public GenericStack() //这才是对的
public class GenericMethodDemo {
public static void main(String[] args){
GenericMethodDemo.<Integer>print(*);
GenericMethodDemo.<String>print(*);
}
public static<E> void print(E[] list) {
}
}
可以将泛型指定为另外一个类型的子类型。这样的泛型称为受限的(bounded)
例如<E extends GeometricObject> //将E指定为GemoetricObject的泛型子类型。此时必须传入GeometriObject的实例
为什么要使用泛型方法 ??
因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。
//http://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html
原始类型和向后兼容
GenericStack stack = new GenericStack();// raw type 原始类型
大体等于
GenericStack<Object> stack = new GenericStack<Object>();
jdk1.5开始,java.long.Comparable中使用泛型类型,但是,许多代码依然使用原始类型:
<pre name="code" class="java">public class Max {
public static Comparable max(comparable o1,comparable o2) {
if(o1.compareTo(o2) >0 )
return o1;
else
return o2;
}
}
Max.max("Welcome", 23) // 23 is autoboxed into new Integer(23)
更好的编写max的方法是使用泛型类型
<pre name="code" class="java">public class Max {
public static <E extends Comparable<E> > E max(E o1,E o2) {
if(o1.compareTo(o2) >0 )
return o1;
else
return o2;
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
通配泛型类型
有这样一个函数 public static double max(GenericStack<Number> stack){}
1. ? // 非受限通配 它和? extends Object是一样的
2. ? extends T // 受限通配 表示T或T的一个未知子类
将GenericStack<Number> 改为 GenericStack<? extends Number>,则 GenericStack<Integer> ,GenericStack<Double>类型的对象都可以使用max()函数
3. ? super T //下限通配 表示T或T的一个未知的父类
相关文章
- 暂无相关文章
用户点评