無理です。
でもAdapterパターンをいい感じに使えばそれっぽいことができます。
したいことは既存のクラスに触らずにインタフェースを追加したいのでAdapterパターンなのです。
/** 人です。名前を持ってます */
class Person(val name: String)
/** 挨拶できる何かです */
trait Greeter {
fun greet(): String
}
/** 挨拶を装飾します */
fun decorate(greeter: Greeter) = "☆★☆${greeter.greet()}☆★☆"
fun main(args : Array<String>) {
val taro = Person("Taro")
val greetingPhrase = decorate(taro) // ここでtaroをGreeterとしてdecorateに渡したい!!
println(greetingPhrase)
}
拡張関数でおk。
fun Person.asGreeter() = object: Greeter {
override fun greet() = "Hello, I'm $name"
}
これでPersonをいじらずに型を追加できました(PersonはGreeterになる手段を手に入れた!)。
fun main(args : Array<String>) {
val taro = Person("Taro")
val greetingPhrase = decorate(taro.asGreeter())
println(greetingPhrase) // => ☆★☆Hello, I'm Taro☆★☆
}