前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java泛型中的通配符 T,E,K,V,?

java泛型中的通配符 T,E,K,V,?

作者头像
仙士可
发布2023-02-01 14:44:45
6350
发布2023-02-01 14:44:45
举报
文章被收录于专栏:仙士可博客仙士可博客

温馨提示:

本文最后更新于 2022年12月30日,已超过 31 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

java泛型

java泛型(generics)是jdk5引入的新特性,泛型提供了编译时类型安全检测机制,该机制运行开发者在编译时检测到非法的类型.

泛型的本质是参数化类型,也就是说,将所操作的数据类型作为一个参数传递,通过这个类型参数,就能识别这个变量的类型

代码语言:javascript
复制
public class TestGeneric<T> {
    private T t;
    public void setT(T t) {this.t = t;}
    public T getT() {return t;}
    public static void main(String[] args) {
        //这里直接指定String作为参数类型
        TestGeneric<String> testGeneric = new TestGeneric<>();
        //setT时,T就是String
        testGeneric.setT("test");
        //可以直接打印getT(),默认为String
        System.out.println(testGeneric.getT());
    }
}

泛型中的通配符

在正常情况下,只要是满足常量命名的字符串,都可以作为通配符使用,例如:T,E,K,V,A1,A1111111111,等等,但是通配符肯定不会需要用到这么多,不管是什么字符,都是代表着 "通配符",所以一般会一些有意义的字母,来表示不一样的通配符.

  • K和V 表示key,value,比如用于map的通配符
  • T(type) 表示具体的一个java类型
  • E (element) 表示一个元素,例如List

除了这几个特定意义的通配符之外,还存在 ? 无界通配符,这个东西一般会在方法参数上使用,搭配 <T extends E><T super E> 使用

上界通配符 <T extends E>

该符号表示,在参数中,传入的类型必须是E或者继承与E的子类,在使用时,可以使用E的方法

代码语言:javascript
复制
    public static void main(String[] args) {
        //这里直接指定String作为参数类型
        TestGeneric<String> testGeneric = new TestGeneric<>();
        HashMap<String, Integer> hashMap = new HashMap<>();
        hashMap.put("a",1);
        Map map = testGeneric.test(hashMap);
        System.out.println(map.get("a"));
    }
    public <E extends Map> E test( E e) {
        return e;
    }

可以看出,在test方法中,传入了hashmap(实现了Map接口),可以正常使用 如果有多个类型参数,则使用逗号分隔即可

下界通配符<? super E>

下界: 用 super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至 Object

代码语言:javascript
复制
private <T> void test(List<? super T> dst, List<T> src){
    for (T t : src) {
        dst.add(t);
    }
}

public static void main(String[] args) {
    List<Dog> dogs = new ArrayList<>();
    List<Animal> animals = new ArrayList<>();
    new Test3().test(animals,dogs);
}
// Dog 是 Animal 的子类
class Dog extends Animal {

}

特殊的?通配符

在上面我们可以看到,上界通配符是 <T extends E>,下界通配符确是<? super E>

?和T都表示不确定的类型,区别在于一个是字母,可以直接操作,但是对? 不能直接操作,比如:

代码语言:javascript
复制
// 可以
T t = operate();

// 不可以
?car = operate();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • java泛型
  • 泛型中的通配符
    • 上界通配符 <T extends E>
      • 下界通配符<? super E>
        • 特殊的?通配符
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档