Java基础-泛型

泛型的定义

  1. 类或接口上定义泛型
class Demo<T>{
    public void show(T t){
        
    }
}
interface Demo<T>{
    public void show(T t)
}
  1. 方法上定义泛型
class Demo{
    public <E> void show(E e){
    }
}

注意:如果类和方法上同时定义了泛型,如下

class Demo<T>{
    public <T> void show(T t){
    }
}

方法上的泛型和类上的泛型就无关了,换句话,同名的情况下,方法上的优先。上面的定义等同

class Demo<T>{
    public <E> void show(E e){
    }
}

使用示例

import java.util.*;
 
class Fruit { 
    public String toString() { 
       return "Fruit"; 
    }
}
 
class Apple extends Fruit {
    public String toString(){
        return "Apple";   
    }
}
 
class Person { 
    public String toString(){  
    return "Person";   
    }
}
 
class Demo<T>{
 
    void show_1(T t){
        System.out.println("show_1  "+ t.toString());
    }
     
    <E> void show_2(E e){
        System.out.println("show_2  "+e.toString());
    }
     
    <T> void show_3(T t){
        System.out.println("show_3  "+t.toString());
    }
 
    public static void main(String[] args) {
        Demo<Fruit> o = new Demo<Fruit>();
        Fruit f = new Fruit();
        Apple a = new Apple();
        Person p = new Person();
        System.out.println("show_1 演示________________________");
        o.show_1( f );
        o.show_1( a );
//      o.show_1( p );  把这行代码去掉注释看一下,是不能编译通过的。因为在
//      ClassName<Fruit>中已经限定了全局的T为Fruit,所以不能再加入Person;
        System.out.println("show_2 演示________________________");
        o.show_2( f );
        o.show_2( a );
        o.show_2( p );
        System.out.println("show_3 演示________________________");
        o.show_3( f );
        o.show_3( a );
        o.show_3( p );
         
    }
}

演示结果

show_1 演示________________________
show_1  Fruit
show_1  Apple
show_2 演示________________________
show_2  Fruit
show_2  Apple
show_2  Person
show_3 演示________________________
show_3  Fruit
show_3  Apple
show_3  Person

从show_2 和show_3来看可以证明上面的概述,show_2和show_3传入的对象不局限于Fruit

泛型的上限和下限

  • 指明了泛型的上限为Fruit以及Fruit的子类
class Fruit { 
    public String toString() { 
       return "Fruit"; 
    }
}
 
class Apple extends Fruit {
    public String toString(){
        return "Apple";   
    }
}

class RedApple extends Apple {
    public String toString(){
        return "RedApple";   
    }
}

//正确示例
//T 可以为Fruit和其子类
class Demo<T extends Fruit>{
    void show(T t){
        System.out.println("show : "+ t.toString());
    }
    public static void main(String[] args) {
      Demo demo =new Demo();
      demo.show(new Fruit());
      demo.show(new Apple()); 
      demo.show(new RedApple());
    }
}

//错误示例
//T 可以为Apple和其子类,Fruit属于Apple 父类
class Demo2<T extends Apple>{
    void show(T t){
        System.out.println("show : "+ t.toString());
    }
    public static void main(String[] args) {
      Demo2 demo =new Demo2();
      //错误 Demo2制定了上限为Apple 
      //demo.show(new Fruit());
      demo.show(new Apple()); 
      demo.show(new RedApple());
    }
}

  • 指明了泛型的下限
class Fruit { 
    public String toString() { 
       return "Fruit"; 
    }
}
 
class Apple extends Fruit {
    public String toString(){
        return "Apple";   
    }
}

class RedApple extends Apple {
    public String toString(){
        return "RedApple";   
    }
}

class Demo<T super Fruit>{
    void show(T t){
        System.out.println("show : "+ t.toString());
    } 

    public static void main(String[] args) {
      Demo demo =new Demo();
      demo.show(new Fruit());
      //错误,demo制定了下限为Fruit
      //demo.show(new Apple());
      //demo.show(new RedApple()); 
    }
}

class Demo<T super Apple>{
    void show(T t){
        System.out.println("show : "+ t.toString());
    } 

    public static void main(String[] args) {
      Demo demo =new Demo();
      demo.show(new Fruit());
      demo.show(new Apple());
      //错误,demo制定了下限为Apple
      //demo.show(new RedApple()); 
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值