黑马程序员.Android攻城狮.JAVA基础.1.8.Java泛型

Java泛型

---------- android培训、java培训、期待与您交流!----------

1、泛型的概念   

        在JDK1.5之后,Java中出现了泛型的概念,主要是为了解决数据类型的安全问题。将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决问题。
        使用泛型的主要原理就是:在类的声明时通过一个标识表示类中某个属性的类型,或者是某个方法的返回值 类型及参数类型。这样在类声明或者实例化的时候只要制定好需要的类型即可。

2、泛型的使用  

        泛型用“<E>”来表示,其中的E并没有实际的意义,可以为任意的字母,E代表一个数据类型,并且这个类型是由外部定义的,当使用时“<E>”用来接收外部所定义的类型。
        在不使用泛型之前,当类中操作的引用数据类型不确定的时候,用Object来进行扩展,现在可以用泛型来表示,这样可以避免强转的麻烦,而且将运行问题转移到的编译时期。
        (1) 泛型可以定义类
        什么时候定义泛型类?当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在来定义泛型来完成扩展,如:
class A{}
class B{}
class Utils
   
   
    
    {
	private T t;
	public void setObject(T t){
		this.t = t;
	}
	public T getObject(){
		return t;
	}
}
public class FanXing {
	public static void main(String[] args) {
		Utils
    
     u = new Utils
    
    ();
		u.setObject(new A());
		A a = u.getObject();
	}
}

   
   

        (2) 泛型可以定义方法
        为了让不同方法操作不同的数据类型,可以将泛型定义在方法上。
class Demo{
	public 
    
    
     
      void show(T t){
		System.out.println("show"+t);
	}
	public 
     
      void print(Q q){
		System.out.println("print"+q);
	}
}
public class FanXing {
	public static void main(String[] args) {
		Demo d = new Demo();
		d.show("hello");
		d.print(new Integer(10));
	}
}

    
    

        (3) 泛型可以同时定义在类与方法中
class Demo
    
    
     
     {
	public void show(T t){
		System.out.println("show"+t);
	}
	public 
     
      void print(Q q){
		System.out.println("print"+q);
	}
}
public class FanXing {
	public static void main(String[] args) {
		Demo
      
      
       
        d = new Demo
       
       
        
        ();
		d.show("hello");
		d.print(new Integer(10));
	}
}

       
       
      
      
    
    

        (4) 静态方法不可以访问定义在类上的泛型,可以将泛型定义在静态方法上,且<>要放在返回值类型前
        (5) 泛型也可以定义在接口上
interface Inter
    
    
     
     {
	void show(T t);
}
class Demo
     
     
      
       implements Inter
      
      
       
       {
	public void show(T t){
		System.out.println("show"+t);
	}
}
public class FanXing {
	public static void main(String[] args) {
		Demo
       
       
        
         d = new Demo
        
        
          (); d.show("hello"); } } 
        
       
       
      
      
     
     
    
    

        (6) 也可以对类指定多个泛型
import java.io.File;
import java.io.IOException;

class Demo
     
     
      
      {
	public void show(T t){
		System.out.println("show"+t);
	}
	public void print(R r){
		System.out.println("print"+r);
	}
}
public class FanXing {
	public static void main(String[] args) {
		Demo
      
      
       
        d = new Demo
       
       
        
        ();
		d.show("hello");
		d.print(new Integer(4));
	}
}

       
       
      
      
     
     

3、通配符

        通配符的概念:在以上的泛型中都是指定了一个固定的类型,而使用通配符则可以解决当具体类型不确定的情况,这个通配符就是 “?” ,当操作类型时,不需要使用类型的具体功能时,只使用Object类中的功能。那么可以用 “?” 通配符来表未知类型。
        在引用传递时,在泛型的操作中也可以设置一个泛型对象的范围上限及下限,即:泛型限定。
        (1) 上限:使用“?extends E”可以接收E类型或者E的子类型对象,如下示例:
class Info
    
    
     
     {    //定义Info类
	private T t;
	public T getT(){
		return t;
	}
	public void setT(T t){
		this.t = t;
	}
}
public class FanXing{
	public static void main(String[] args){
		Info
     
     
      
       i1 = new Info
      
      
       
       ();
		Info
       
       
        
         i2 = new Info
        
        
          (); Info 
         
           i3 = new Info 
          
            (); i1.setT(30); i2.setT(23.1f); i3.setT("hello"); function(i1); function(i2); function(i3); //当传递String类型时会报错 } //该方法只能接收Number的子类型 public static void function(Info 
            i){ System.out.println(i.getT()); } } 
           
          
        
       
       
      
      
     
     
    
    

        (2 )下限:使用“?super E”可以接收E类型或者E的父类型对象。
        上限什么时候用:往集合中添加元素时,既可以添加E类型对象,又可以添加E的子类型对象。为什么?因为取的时候,E类型既可以接收E类对象,又可以接收E的子类型对象。

        下限什么时候用:当从集合中获取元素进行操作的时候,可以用当前元素的类型接收,也可以用当前元素的父类型接收。


---------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值