假设我有一个异构的map容器,其中键包含值的类型信息:
interface Container<K : Container.Key<*>> {
interface Key<V>
interface Entry<K : Key<V>, V>
}
我想有一个类似于get()
的函数,
fun <V> get(key: Key<V>): V?
但也要将此函数限制为我们的类型参数K
--其想法是,实现Container
的类也可能具有其自定义键类型Container.Key<V>
,因此我们希望get()
的输入参数为Container.Key<V>
。
这在Kotlin中可以表达吗?
1条答案
按热度按时间anauzrmj1#
不,这是不可能的(还没有)。
你基本上想要:
也就是说,
get
应该接受一个既是K
又是Key<V>
的东西。不幸的是,这种类型的交叉口还没有可用。Kotlin只支持
T & Any
形式的交集类型,其中T
是一个可空的类型参数,以表示“T的不可空版本”。关于添加更好的交叉类型支持,有一个冗长的讨论here。
所以现在,您只能在运行时强制执行
TKey: K & Key<V>
。取两个参数-K
和Key<V>
。强调它们是同一个对象。在实现中,您应该检查
key1 === key2
。请注意,我们不能在运行时检查一个键是否确实是
Key<V>
而不是Key<SomethingElse>
,因为V
被擦除了。你可以使用KClass<V>
来解决这个问题,但是如果V
本身是参数化的,那么这就不好用了。如果这对你来说没问题,并且你的
Key
接口有办法告诉你它是否是Key<V>
,给定一个KClass<V>
,你可以使用这样的签名: