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 T, in 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极简教程