美文网首页
Java泛型通配符,上下界。

Java泛型通配符,上下界。

作者: HWilliamgo | 来源:发表于2019-02-17 20:14 被阅读8次

为了理清楚泛型的通配符和上下界的作用,并为了Kotlin的泛型中的关键字inout的理解,在此用小demo重新梳理一遍对泛型的理解。

demo

public class Example {
    //程序入口
    public static void main(String[] args) {
        Source<? extends Number> sourceOfNumber = new Source<>();
        Number params = sourceOfNumber.getParams();//get()方法,通过编译
        sourceOfNumber.setParams(1);//①set()方法,不通过编译

        Source<? super Integer> sourceOfParentOfInt = new Source<>();
        sourceOfParentOfInt.setParams(new Integer(1));//set()方法,通过编译
        Number i = sourceOfParentOfInt.getParams();//②get()方法,不通过编译
    }
    
    //包装对象
    private static class Source<T> {
        private T params;
        
        public T getParams() {
            return params;
        }

        public void setParams(T params) {
            this.params = params;
        }
    }
}

以下来自《疯狂Kotlin讲义》并结合上述代码的理解。

通配符下界Source<? super Integer>

在这里,T就是? super Integer。由于Source<T>中的泛型一定是Integer的父类,因此程序总是可以向Source对象传入Integer值。但从Source<T>中取出对象是不安全的,因为无法预测到取出的是Number对象还是Object对象,即无法判断demo中的sourceOfParentOfInt引用的对象实际是Source<Number>还是Source<Object>

因此往对象中设置值总是安全的,取出值总是不安全的。

通配符上界Source<? extends Integer>

在这里,T就是? extends Number。由于Source<T>中的泛型一定是Number的子类,因此程序从Source对象中取出的T一定是Number的子类,即可以用Number来引用。但是向其中传入对象是不安全的,因为你不能确定demo中的sourceOfNumber引用的到底是Source<Float>还是Source<Integer>,如果是引用了Source<Float>对象,而你往里面传了一个Integer,那么程序就出错了。

因此从对象中取出值是安全的,但是往对象中设置值是不安全的。

相关文章

  • Kotlin-泛型

    源自:码上开学-Kotlin的泛型 kotlin的in和out对应的是java中带上界和下界的通配符?号。【in】...

  • JAVA泛型总结

    泛型命名 泛型一些约定俗成的命名: 上界通配符 可以使用上界通配符来缩小类型参数的类型范围。 下界通配符 下界通配...

  • Java泛型通配符,上下界。

    为了理清楚泛型的通配符和上下界的作用,并为了Kotlin的泛型中的关键字in和out的理解,在此用小demo重新梳...

  • java 泛型 上下界通配符

    1. 为什么要用通配符和边界? 2.Plate下边界通配符范围 Plate

  • 泛型的上/下界通配符

    上界不能往里存,只能往外取 比如,我们现在定义:List首先你...

  • Android 学习(一):Java 泛型

    Java泛型学习 1.0 泛型常用案例 2.0 泛型方法 3.0 泛型类 4.0 通配符 ? 通配符,占位符,标识...

  • Java 泛型之上界下界通配符

    本Java教程是为JDK 8编写的。本页描述的示例和实践没有利用后续版本中引入的改进。 泛型,继承和子类 如你所知...

  • 泛型:super、extend、?

    先讲结果: super 是指定泛型的『下界』; extend 是指定泛型的『上界』; ?是通配符; 看个例子 打印...

  • [Java菜鸟系列] 「林彪」教你"通配符泛型

    J007- [Java菜鸟系列] 「林彪」教你"通配符泛型" 菜鸟:Java方法参数中的泛型通配符要怎么理解?老湿...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

网友评论

      本文标题:Java泛型通配符,上下界。

      本文链接:https://www.haomeiwen.com/subject/gakneqtx.html