黑马程序员_泛型的上限与下限

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

★设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类:

  • 声明对象:类名<?extends 类> 对象名
  • 定义类:类名<泛型标签 extends 类>{}

★设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类:

  • 声明对象:类名<?super 类> 对象名称
  • 定义类:类名<泛型标签 extends类>{} 

public static void  show(List
   
    list){
}
public static void  show(List
   
    list){
}
public static voidshow(List
   
    list){}
public static void show(List
   
    list){}

泛型的上限

public static void main(String[] args) {
       Person
   
   
    
     p1 = new Person<>();
       p1.setVal(99);
       Person
    
    
     
      p2 = new Person<>();
       p2.setVal(3.14);
       Person
     
     
      
       p3 = new Person<>();
       p3.setVal("007");
       show(p1);//正确
       show(p2);//正确
       show(p3);//错误
    }
    public static void show(Person
      
       p)
    {//限定Person的参数类型只能是Number或者是其子类,这里String并不属于Number。
       System.out.println(p.getVal());
    }

     
     
    
    
   
   

泛型的下限

public static void main(String[] args) {
       Person
   
   
    
     p1 = new Person<>();
       p1.setVal(99);//Integer
       Person
    
    
     
      p2 = new Person<>();
       p2.setVal(3.14);//Double
      
       Person
     
     
      
       p3 = new Person<>();
       p3.setVal("007");//String
       Person
      
       p4 = new Person<>();
       p4.setVal(new Object());//Object
 
       show(p1);//错误
       show(p2);//错误
       show(p3);//正确
       show(p4);//正确
    }
    public static void show(Person
       
        p){
       System.out.println(p.getVal());
    }

例子

package generic;
 
import java.util.ArrayList;
import java.util.List;
 
public class GenericDemo03 {
    public static void main(String[] args) {
       //show方法用List
            
            接收,可以是任意类型
       List
            
            
             
              l1 = new ArrayList<>();//new ArrayList
             
             
              
              ()
       show(l1);
       List
              
              
               
                l2 = new ArrayList<>();
       show(l2);
       List
               
               
                
                 l3 = new ArrayList<>();
       show(l3); 
       List
                
                 l4 = new ArrayList<>();
       show(l4);
       //使用up方法接收类型为Number或者其子类
       //up(l1);//错误,因为up方法接收类型为Number或者其子类,l1(String)不符合!
       up(l2);
       up(l3);
       //使用down方法的话接收类型为Number或者其父类
       //down(l2);error
       down(l3);
       down(l4);
    }
public static voiddown(List
                 
                  list){
      
       for (Object object : list) {
           System.out.println(object);
       }
    }
public static voidup(List
                 
                  list){
      
       for (Object object : list) {
           System.out.println(object);
       }
    }
    publicstaticvoid show(List
                 
                  list){
      
       for (Object object : list) {
           System.out.println(object);
       }
    }
}


                 
                 

★为了能存储任意类型的对象,save()方法的参数需要定义为Object类型,同样get()方法的返回值
也需要时Object类型,但是当使用get()方法取出这个值时,有可能忘记当初存储的是什么类型的值
,在取出时将其转换为String类型,这样程序就会发生类型不匹配错误。为了避免这个问题,就可以
使用泛型,定义一个类<T>,声明参数类型,将save()方法的参数类型和get()方法的返回值类型都
声明为T,这样在取出元素时,就无须再进行类型转换。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值