Kotlin基础(四)

Kotlin基础(四)

4.泛型

  • 泛型主要是用来限制集合类持有的对象类型,使得类型更加安全。当一个集合类里面放入了错误类型的对象,编译器就会报错.

4.1 Kotlin中的泛型

val map = mutableMapOf<Int,String>(1 to "a", 2 to "b", 3 to "c")
map.put(4,"c")
//Kotlin中有类型推断的功能,有些类型参数可以直接省略不写
val map = mutableMapOf(1 to "a", 2 to "b", 3 to "c")

4.2 Java中泛型使用时需要注意的

  • set方法,编译器无法知道具体的类型,所以会拒绝调用

    List<? extends Animal> list1 = new ArrayList<>();
    list1.add(new Dog());		//ERROR
    list1.add(new Animal());	//ERROR
    
  • get方法,编译器知道返回对象的类型,允许调用

    List<? extends Animal> list1 = new ArrayList<>();
    List<Dog> list4 = new ArrayList<>();
    list4.add(new Dog());
    list4.add(new Dog());
    list1 = list4;	//SUCCESS
    

4.3Kotlin中泛型使用时需要注意的

  • 在 Java 泛型里,有通配符 ?。用 ? extends T 指定类型参数的上限,用 ? super T 指定类型参数的下限。Kotlin 抛弃了这个西,引用了生产者和消费者的概念 PECS

    public static <T> void copy(List<? super T> dest, List<? extends T> src) {
    ...
    ListIterator<? super T> di=dest.listIterator(); // in T, 写入dest数据
    ListIterator<? extends T> si=src.listIterator(); // out T, 读取src数据
    ...
    }
    
  • List<? super T> dest 是消费数据的对象,这些数据会写入到该对象中。

  • List<? extends T> src 是生产提供数据的对象。

  • 在Kotlin中,把那些只能保证读取数据时类型安全的对象叫做生产者,用 out T 标记;把那
    些只能保证写入数据安全时类型安全的对象叫做消费者,用 in T 标记。

  • out T 等价于 ? extends Tin T 等价于 ? super T ,此外, ***** 等价于 ?

4.4 星投影

  • 如果类型被声明为 interface Function <in T, out U> ,有以下星投影:
  • Function<*, String> 表示 Function<in Nothing, String>
  • *Function<Int, > 表示 Function<Int, out Any?>
  • *Function<*, > 表示 Function<in Nothing, out Any?>

4.5 泛型类

class Box<T>(t: T) {
    var value = t
}

4.6 泛型函数

fun <T> singletonList(item: T): List<T> {}
fun <T> T.basicToString() : String {}// 扩展函数

参考资料

  • Kotlin极简教程
发布了64 篇原创文章 · 获赞 65 · 访问量 8805

猜你喜欢

转载自blog.csdn.net/qq_33334951/article/details/103664512