- 泛型类型参数
- 类型参数要么被显示的声明出来,要么可以推导(和Java不同)
- 函数声明
fun <T> List<T>.slice(indices: IntRange): List<T>
- 扩展属性
val <T> List<T>.penultimate: T
get() = this.[size - 2]
class StringList: List<String> { //确定了类型都是String
override fun get(i: Int) : String {...}
}
class ArrayList<T>: List<T>{
override fun get(i: Int) : T {...}
}
<T extend Type> //java
<T: Type> // kotlin
//kotlin特有的多个上界约束
fun <T> foo(p: T) where T: Type1,T: Type2{ ... } //T必须是Type1和Type2的子类或实现类
<T> == <Any?> //所以类型可为null
<T:Any> // 这样就不能为null了
- 运行时类型擦除
value is List<String> // error,现在的value是List
value is List<*> // pass
inline fun <reified T> isA (value: Any) = value is T
// Kotlin 自带函数
list.filterIsInstance<T>() // 过虑为T类型的数据
- 带reified的inline函数不能在Java中调用
- 变型
见P250
kt: <out T> ~= java :<? extends T> //只做生成类型,kotlin叫协变
kt: <in T> ~= java :<? super T> //只做消费类型,kotlin叫逆变
- 点变 P254
书上大概说的是: <out T>可读不可变可作为方法的返回值<in T>可变不读可作为方法是参数
- <*> == <?>
网友评论