星號投射(star-projection)
Prerequisites:
KProperty
在 Kotlin reflection(反射)裡,KProperty
T 是屬性的型別,例如:
1
2
val count: Int = 10
val prop: KProperty<Int> = ::count
這裡 T = Int。
為什麼會寫 KProperty<*>?
* 在 Kotlin 泛型裡叫 星號投射(star-projection)
意思是「不管這個泛型實際是什麼類型,我都可以接受」
類似於 Java 的 ? 或 ? extends Object(上界 wildcard)
範例
1
2
3
fun printName(prop: KProperty<*>) {
println("屬性名稱: ${prop.name}")
}
無論是 KProperty
因為我們只想拿 name,不關心具體型別
Kotlin 的 * vs Java 的 ?
| Kotlin | Java | 說明 |
KProperty<*> |
KProperty<?> | 可以接任何型別,等同於 Java wildcard |
| KProperty<out Any?> | KProperty<? extends Object> | 上界通配符 |
| KProperty |
KProperty<? super String> | 下界通配符 |
所以 * 不是「所有類別」本身,而是「不管泛型是什麼都接受」
實務例子
1
2
3
4
5
6
7
8
9
10
11
var name: String = "Mia"
var age: Int = 30
fun printPropertyName(prop: KProperty<*>) {
println(prop.name)
}
fun main() {
printPropertyName(::name) // 可以接受 String
printPropertyName(::age) // 可以接受 Int
}
如果寫成 KProperty
用 KProperty<*> 就能同時接受任意型別屬性
總結:
KProperty<*> = 「不管泛型型別是什麼都可以」
對應 Java 的 KProperty<?>
常用在只需要屬性描述(如 name、get()、set())而不關心型別時。