java的泛型回顾

前言

这边博文例子是自己测试并整理的,有点凌乱,但是耐心看下去还是能对泛型略知一二的。具体详细的泛型介绍有一篇写的很好的博客:

——————此处传送门——————

几个常见的符号

遇到一些泛型的代码,经常见到这几个符号,一开始学的时候也是糊里糊涂。

  • E:Element,表示集合中的元素
  • T:Type(Java类)
  • K:key(键)
  • V:value(值)
  • N:number(数值类型)
  • ?:表示不确定的数值类型

小例子

package genericity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

public class TestGenericity {
    private String s = "this is string...";
    public static void main(String[] args) {
        //测试
        One<? extends List> one = new One<ArrayList>();//正确
        /*
         * class Two<T extends Collection<? extends List>>
         * */
        //Two<List> two = new Two<List>();报错
        Two<Collection<List>> two = new Two<Collection<List>>();//正确
        Two<List<ArrayList<String>>> two2 = new Two<List<ArrayList<String>>>();//正确
        Two<LinkedList<ArrayList<String>>> two3 = new Two<LinkedList<ArrayList<String>>>();//正确
//      Two<LinkedList<Collection>> two4 = new Two<LinkedList<Collection>>();//报错,超过上限
        /**
         * class Three<T extends Collection<? super ArrayList>>
         * */
        Three<List<ArrayList>> t1 = new Three<List<ArrayList>>();//正确
        Three<ArrayList<ArrayList>> t2 = new Three<ArrayList<ArrayList>>();//正确
        Three<ArrayList<List>> t3 = new Three<ArrayList<List>>();//正确
        //因为超过了下线ArrayList,所以会报错
//      Three<ArrayList<SonOfArrayList<String>>> t4 = new Three<ArrayList<SonOfArrayList<String>>>();//正确

        /*
         * 测试T和Class<T>区别:
         * 1. T:表示具体的对象
         * 2. Class<T>:表示该T对象的类型,如果T是String则返回
         *    的是Class.newInstence就是String类型的
         * */
        System.out.println("1:"+String.class);//class java.lang.String
        System.out.println("2:"+String.class.getName());//java.lang.String
        System.out.println("3:"+one.getType(String.class));//java.lang.Class

        String str = new String("asd");
//      System.out.println(str);//会报错,把Class<T>改为T后正确
        String str2 = one.getType(str.getClass());
        System.out.println("4:"+str2.toString());//java.lang.Class
        try {
            //得到实例str2.getClass().newInstance();获得一个String类型的对象
            //5:java.lang.String
            System.out.println("5:"+str2.getClass().newInstance().getClass().getName());
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
//      str2=123;//报错
        System.out.println("6:"+str2.getClass().getName());//java.lang.String


    }
}
/*
  * 此处的 T 为类型实参,表示T类型是Collection的子类
  * */
class One<T extends Collection>{
    /* 泛型方法示例
      * @param <T extends Object>:指明T的类型
      * @param T:返回值的类型
      * @param Class<T>:表示泛型T的具体类型
      * @param c:用来创建T代表的类的对象 
      * */
    protected <T extends Object> T getType(Class<T> clazz){
        return (T) clazz.getClass().getName();      
    }
}

/*  ?表示有限制的通配符,表示不确定的类型
 *  extends:确定泛型的上限
 * */
class Two<T extends Collection<? extends List>>{

}
/*
 * super确定了泛型的下限
 * */
class Three<T extends Collection<? super ArrayList>>{

}

//ArrayList的子类
class SonOfArrayList<E> extends ArrayList<E>{

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值