美文网首页
泛型简单总结

泛型简单总结

作者: 机智的黑猫 | 来源:发表于2020-02-27 18:23 被阅读0次

为了方便理解首先先创建3个类

public class A {
        public void printA() {

        }
    }

    public class B extends A {
        public void printB() {

        }
    }

    public class C extends B {
        public void printC() {

        }
    }

 public class GenericHolder<T> {
        T t;

        public void putItem(T item) {
            t = item;
        }

        public T getItem() {
            return t;
        }

    }

如果希望只取出,不插入,或者是方法的返回值是泛型参数没有 就使用? extends B
也叫做上边界通配符,协变

       GenericHolder<? extends B> holder1 = new GenericHolder<>();
        A a = new A();
        B b = new B();
        C c = new C();

        holder1.putItem(a);//编译错误
        holder1.putItem(b);//编译错误
        holder1.putItem(c);//编译错误


        A a1 = holder1.getItem();
        B b1 = holder1.getItem();
        C c1 = holder1.getItem();//编译错误
        val holder1:GenericHolder<out B> = GenericHolder()
        val a = A()
        val b = B()
        val c = C()
        holder1.putItem(a)//编译错误
        holder1.putItem(b)//编译错误
        holder1.putItem(c)//编译错误

        val a1: A? = holder1.item
        val b1: B? = holder1.item
        val c1: C? = holder1.item//编译错误

如果希望只插入,不取出,或者是方法的参数是泛型返回值没有 就使用? super B
也叫做下边界通配符,逆变

      GenericHolder<? super B> holder2 = new GenericHolder<>();
        A a = new A();
        B b = new B();
        C c = new C();

        holder2.putItem(a);//编译错误
        holder2.putItem(b);
        holder2.putItem(c);


        A a1 = holder2.getItem();//编译错误
        B b1 = holder2.getItem();//编译错误
        C c1 = holder2.getItem();//编译错误
        val holder2:GenericHolder<in B> = GenericHolder()
        val a = A()
        val b = B()
        val c = C()
         holder2.putItem(a)/编译错误
        holder2.putItem(b)
        holder2.putItem(c)

        val a1: A? = holder1.item  //编译错误
        val b1: B? = holder1.item / /编译错误
        val c1: C? = holder1.item //编译错误

补充
kotlin中的*
MutableList<*> 表示的是 MutableList<out Any?>
Kotlin 中可以用UnsafeVariance注解打破编译器对in out的限制 但同时也会失去运行时的状态确认,参考 collections.kt

image

相关文章

  • 泛型简单总结

    为了方便理解首先先创建3个类 如果希望只取出,不插入,或者是方法的返回值是泛型参数没有 就使用? extends ...

  • Java泛型

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

  • 泛型、型变与投影

    简单泛型 kotlin 对于简单泛型的支持与java类似, 可以通过通配符,提升代码的灵活度 限定型泛型 在编码实...

  • 泛型简单的应用总结:

    泛型可以应用在类,方法,接口中,可以定义泛型类,泛型方法,泛型接口三种 利用泛型的好处: 可以有效的减少代...

  • 泛型

    与Java泛型相同,Kotlin同样提供了泛型支持。对于简单的泛型类、泛型函数的定义,Kotlin 与 Java ...

  • JDK1.5后增加了泛型,那么为什么要有泛型呢?我们该如何自定义

    本篇主要讲解java泛型的理解、集合中简单使用泛型、自定义泛型结构(包括类、接口、方法)。 一、什么是泛型? 通俗...

  • java基础-泛型

    泛型类 泛型类(generic class) 就是具有一个或多个类型变量的类。一个泛型类的简单例子如下: 泛型接口...

  • Java泛型总结

    Java泛型总结# 泛型是什么## 从本质上讲,泛型就是参数化类型。泛型十分重要,使用该特性可以创建类、接口以及方...

  • Java笔记---泛型

    总结了泛型的基本语法、上下级通配符、泛型反射以及使用泛型的一些实践,看完还不会用泛型你顺着网线来打我(狗头)。 我...

  • 泛型总结

    泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固...

网友评论

      本文标题:泛型简单总结

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