泛型
class MyGenericsClass<T> {
fun method(param: T): T {
return param
}
}
val myIntClass = MyGenericsClass<Int>()
val myStringClass = MyGenericsClass<String>()
println(myIntClass.method(26))
println(myStringClass.method("Yang"))
26
Yang
val myIntMethod = MyGenericsMethod()
val myStringMethod = MyGenericsMethod()
println(myIntMethod.method<Int>(26))
println(myStringMethod.method<String>("Yang"))
26
Yang
val myIntProperty = MyGenericsProperty<Int>().apply { property = 26 }
val myStringProperty = MyGenericsProperty<String>().apply { property = "Yang" }
println(myIntProperty.property)
println(myStringProperty.property)
26
Yang
class MyConstraint {
fun <T : Number?> method(param: T): T = param
fun <T> method(param: T) where T : Number, T : Comparable<T> = param
}
- 上下界泛型约束
out
和in
<out T>
声明的泛型类,T
只能做返回类型,因为<out T>
能确定返回类型一定是T
的子类,T
作为保底返回类型使用,但T
作为类型参数的话,所使用泛型的具体类型不知道是T
的某一个子类<in T>
声明的泛型类,T
只能做类型参数,因为<in T>
能确定类型参数一定是T
的父类,T
作为保底类型参数使用,但T
作为返回类型的话,所使用泛型的具体类型不知道是T
的某一个父类<*>
号,相当于<out Any>
,对比与Java的<? extends Object>
class MyArrayList<T> {}
var myNumerArrayList = MyArrayList<Number>()
var myIntArrayList = MyArrayList<Int>()
class MyArrayList<out T> {}
myNumerArrayList = myIntArrayList
class MyArrayList<in T> {}
myIntArrayList = myNumerArrayList
interface Producer<out T>{
fun get() : T
fun set(t: T)
}
interface Consumer<in T>{
fun set(t: T)
fun get() : T
}
var list: List<*> ?= null
inline fun <reified T> check(value: Any?) {
if (value is T) {
println("和T类型匹配")
} else {
println("和T类型不匹配")
}
}
check<Int>(26)
check<Int>("Yang")
和T类型匹配
和T类型不匹配
inline fun <reified T : Any> getClass(): KClass<T> {
return T::class
}
inline fun <reified T : Any> getJavaClass(): Class<T> {
return T::class.java
}
println(getClass<String>())
println(getJavaClass<String>())
class java.lang.String
class java.lang.String