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的一个未知的父类






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值