泛型中<T> 与 T 的区别

泛型中<T> 与 T 的区别

1. 泛型的概念

泛型的本质:类型参数化或者参数类型化,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制类型。

2. 为什么需要有泛型

对于为什么需要有泛型我们可以从反向考虑,如果没有泛型的话会带来哪些不方便?

一般的类和方法,只能使用具体的类型;要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。

例如:

public class Animal {
    private Dog dog;
    public void paly(Dog dog){
        System.out.println(dog.getClass().getSimpleName()+": "+dog.getName()+" play game" );
    }

    public static void main(String[] args) {
        Animal animal=new Animal();
        animal.paly(new Dog("jack"));
    }
}
class Dog{
    private String name;
    public Dog(String _name){
        this.name=_name;
    }
    public String getName(){
        return name;
    }
}

Animal类中的paly方法只能接收Dog这一个类型,如果需要扩展的话就需要新增方法,这样会带来代码的冗余。如果我们加入泛型的话扩展性就会大大提升,而且编译器还能在编译器为程序提供类型检查。

    public <T>  void paly1(T obj){
        System.out.println(obj.getClass().getSimpleName()+":  play game" );
    }

    public static void main(String[] args) {
        Animal animal=new Animal();
        animal.paly(new Dog("jack"));

        animal.paly1(new Cat("TOM"));
    }
3. 泛型的表现形式
  1. 泛型类:
public interface Generator<T>{
    T next();
}
  1. 泛型方法
    public <T>  void paly1(T obj){
        System.out.println(obj.getClass().getSimpleName()+":  play game" );
    }

注:

使用泛型方法的基本原则:尽量使用泛型方法。也就是说,如果使用泛型方法可以取代整个类泛型化,那么久应该只使用泛型方法,因为它可以使事情更加清楚明白。

4. 实际应用

针对<T>和T的理解:

public <T> T get(T a):<T>是指这是一个泛型,第二个T是指函数返回的参数,第三个T是函数中的参数

一般泛型有约定的符号:E 代表 Element, 通常在集合中使用;T 代表 Type,通常用于表示类;K 代表 Key,V 代表 Value,<K, V> 通常用于键值对的表示;? 代表泛型通配符。

public class daylearn1 {
    public static void main(String[] args) {
        Gen2<String> var2=new Gen2<>();
        //这个时候就限定了var1.getValue中参数类型->必须为String类型
        if(var2.getValue("58") instanceof String){
            System.out.println("var2.getValue() = " + var2.getValue("58"));
        }
        Gen3 var3=new Gen3();
        //这个时候未限定var3.getValue中参数类型-
        System.out.println("var3.getValue() = " + var3.getValue(8));
    }
}
/**
 * 这样写报错提示为:无法解析符号K
 * class Gen1{
 *     public K getNum(K value){
 *         return value;
 *     }
 * }
 *
 * */
class Gen2<K>{
    public K getValue(K value){
        return value;
    }
}

class Gen3{
    public <K> K getValue (K value){
        return value;
    }
}

关于泛型中的通配符可参考文献:
https://blog.csdn.net/lisheng19870305/article/details/110010421

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值