java – 仅限Consumer的kotlin泛型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 仅限Consumer的kotlin泛型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1509字,纯文字阅读大概需要3分钟。
内容图文
![java – 仅限Consumer的kotlin泛型](/upload/InfoBanner/zyjiaocheng/789/8ba55b8c08cf4aa59ab916a288f11ad6.jpg)
让我们说这个java示例:
interface Sink<T> {
void accumulate(T t);
}
public static <T> void drainToSink(Collection<T> collection, Sink<? super T> sink) {
collection.forEach(sink::accumulate);
}
注意第二个参数是如何声明的?超级T.我需要这个,因为我想调用这样的方法:
Sink<Object> sink = .... // some Sink implementation
Collection<String> strings = List.of("abc");
drainToSink(strings, sink);
现在我想用kotlin(我的经验非常少)实现同样的目的:
interface Sink<T> {
fun accumulate(t: T)
}
fun <T> drainToSink(collection: List<T>, sink: Sink<T>) {
....
}
现在我正在尝试使用它:
fun main(args: Array<String>) {
val sink = object : Sink<Any> {
override fun accumulate(any: Any) { }
}
val strings = emptyList<String>()
drainToSink(strings, sink)
}
有趣的是,这不会失败(除非我对kotlin知之甚少).
我真的希望我需要添加类似Sink< in T>的声明.让编译器知道这实际上只是一个消费者,或者默认情况下是T总是打开?
知道kotlin比我更好的人能指出我正确的方向吗?
解决方法:
就像我在评论中所说的那样,T在这里被推断为Any.这就是我让IDE为drainToSink调用添加显式类型参数时所看到的.
由于kotlin的List严格来说是生产者,因为它是不可变的,所以它将它的类型参数声明为E.你得到List< Any>作为drainToSink的参数类型,可以分配List< String>对此:
val strings = emptyList<String>()
val x: List<Any> = strings // works
如果将第一个参数类型更改为MutableList< T>(没有协变类型参数),则示例会失败:
fun <T> drainToSink(collection: MutableList<T>, sink: Sink<T>) {
....
}
val strings = emptyList<String>()
drainToSink(strings, sink) // type mismatch: Required: MutableList<Any>, Found: List<String>
内容总结
以上是互联网集市为您收集整理的java – 仅限Consumer的kotlin泛型全部内容,希望文章能够帮你解决java – 仅限Consumer的kotlin泛型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。