?基本使用。两个泛型类型处理
class MagicBox<T>(item: T) {
private var subject: T = item
var available = false
//泛型作为返回类型参数
fun fetch(): T? {
//available 为空就返回空 不然就返回实例本身
return subject.takeIf { available }
}
//多泛型参数
/**
* 魔盒里面放的是男孩 取得时候编程男人
*/
fun <R> fetch(subjectModFunction: (T) -> R): R? {
return subjectModFunction(subject).takeIf { available }
}
}
class Boy(val name: String, val age: Int) {}
class Man(val name: String, val age: Int) {}
class Dog(val weight: Int)
fun main() {
val box1 = MagicBox(Boy("Jack", 15))
val box2 = MagicBox(Dog(20))
box1.available = true
box1.fetch()?.run {
println("you find name :$name")
}
var man = box1.fetch {
Man(it.name, it.age.plus(15))
}
println(man?.name)
println(man?.age)
}
?
T代表type的意思
R代表retrun的意思。也可以用别的大写字母。但是这个是统一规范
泛型也可以指定父类类型?
<T : Human>
class MagicBox<T : Human>(item: T) {
private var subject: T = item
var available = false
//泛型作为返回类型参数
fun fetch(): T? {
//available 为空就返回空 不然就返回实例本身
return subject.takeIf { available }
}
//多泛型参数
/**
* 魔盒里面放的是男孩 取得时候编程男人
*/
fun <R> fetch(subjectModFunction: (T) -> R): R? {
return subjectModFunction(subject).takeIf { available }
}
}
open class Human(val age: Int)
class Boy(val name: String, age: Int) : Human(age)
class Man(val name: String, age: Int) : Human(age)
class Dog(val weight: Int)
fun main() {
val box1 = MagicBox(Boy("Jack", 15))
val box2 = MagicBox(Dog(20))
box1.available = true
box1.fetch()?.run {
println("you find name :$name")
}
var man = box1.fetch {
Man(it.name, it.age.plus(15))
}
println(man?.name)
println(man?.age)
}
指定后 如果不是父类为Human则会报错
?
|