【发布时间】:2018-07-30 02:52:40
【问题描述】:
我有一些扩展函数想移到成员函数中。但我不知道该怎么做,尤其是嵌套泛型类型链。
import Y.*
abstract class File<T>
open class Y private constructor() {
open class localhost_ {
@JvmName("usr") operator fun div(a: usr.Companion) = usr<localhost_>()
@JvmName("bin") operator fun div(a: bin.Companion) = bin<localhost_>()
@JvmName("etc") operator fun div(a: etc.Companion) = etc<localhost_>()
companion object: localhost_()
}
open class bin<T>: File<T>() { companion object }
open class sh<T>: File<T>() { companion object }
open class etc<T>: File<T>() { companion object }
open class vim<T>: File<T>() { companion object }
open class usr<T>: File<T>() { companion object }
open class local<T>: File<T>() { companion object }
companion object { fun uri(path: Any) = println(path) }
}
operator fun bin<localhost_>.div(a: sh.Companion) = sh<bin<localhost_>>()
operator fun bin<usr<localhost_>>.div(a: vim.Companion) = vim<bin<usr<localhost_>>>()
operator fun etc<localhost_>.div(a: vim.Companion) = vim<etc<localhost_>>()
operator fun usr<localhost_>.div(a: bin.Companion) = bin<usr<localhost_>>()
operator fun usr<localhost_>.div(a: local.Companion) = local<usr<localhost_>>()
operator fun local<usr<localhost_>>.div(a: bin.Companion) = bin<local<usr<localhost_>>>()
/**
* localhost_/
* ├── bin/
* │ └── sh
* ├── etc/
* │ └── vim
* └── usr/
* ├── bin/
* │ └── vim
* └── local/
* └── bin/
*/
fun main(a: Array<String>) {
//Compiles!
Y.uri(localhost_)
Y.uri(localhost_/bin)
Y.uri(localhost_/bin/sh)
Y.uri(localhost_/etc)
Y.uri(localhost_/etc/vim)
Y.uri(localhost_/usr)
Y.uri(localhost_/usr/bin/vim)
Y.uri(localhost_/usr/local)
Y.uri(localhost_/usr/local/bin)
//Does not compile!
Y.uri(localhost_/local)
Y.uri(localhost_/bin/vim)
Y.uri(localhost_/sh)
Y.uri(localhost_/bin/local)
Y.uri(localhost_/etc/local)
Y.uri(localhost_/etc/sh)
Y.uri(localhost_/usr/local/usr)
}
如何将接收器具有泛型类型的扩展函数转换为成员函数?有没有办法将运算符函数放在类中,或者扩展是实现这一点的唯一方法?我已经尝试过这样的事情,但它不起作用:
open class usr<T>: File<T>() {
operator fun <T: usr<localhost_>> div(a: local.Companion) = local<T>()
operator fun <T: usr<localhost_>> div(a: bin.Companion) = bin<T>()
companion object
}
【问题讨论】:
标签: kotlin