当我尝试使用Boolean,Double,Integer,Float覆盖泛型方法时,我遇到了问题.它适用于Date.(可能因为它是Serializable吗?)
界面:
interface AnInterface<C, T> {
fun doSomething(items: List<T>, vararg value: C): List<T>
}
Run Code Online (Sandbox Code Playgroud)
一个抽象的实现:(没有覆盖doSomething)
abstract class BaseClass<C, T> : AnInterface<C, T> { ... }
Run Code Online (Sandbox Code Playgroud)
这是工作:
class AnImplementetion<T> : BaseClass<Date, T>() {
override fun doSomething(items: List<T>, vararg value: Date): List<T> {
// It works
}
}
Run Code Online (Sandbox Code Playgroud)
它不起作用:
class AnAnotherImplementetion<T> : BaseClass<Boolean, T>() {
override fun doSomething(items: List<T>, vararg value: Boolean): List<T> {
// It doens't
}
}
Run Code Online (Sandbox Code Playgroud)
IDE总是希望实现doSomething.当我用IDE实现它时,它总是创建相同的.
错误信息:
Class 'AnAnotherImplementetion' is not abstract and does not implement abstract base class member
public abstract fun fun doSomething(items: List<T>, vararg value: Boolean): List<T> defined in BaseClass
'doSomething' overrides nothing
Run Code Online (Sandbox Code Playgroud)
我该如何解决?谢谢
更新: 它适用于JAVA.但为什么不和Kotlin一起?
public class AnAnotherImplementetion<T> extends BaseClass<Boolean, T> {
@NotNull
@Override
public List<T> doSomething(@NotNull List<? extends T> items, Boolean... value) {
// It works with JAVA
}
}
Run Code Online (Sandbox Code Playgroud)
更新2:
它在vararg可以为空时起作用.
interface AnInterface<C, T> {
fun doSomething(items: List<T>, vararg value: C?): List<T>
}
Run Code Online (Sandbox Code Playgroud)
它看起来像kotlin编译器中的一个bug.据我所知,在编译期间它决定使用原始类型(int)或wrap(Integer).Java泛型不能用于原语,因此编译器使用wrap for generic-type,然后编译器看到,该方法param永远不为null并用primitive-type替换它,并且出现type-conflict.这里可以节省一天.
但我不确定,这只是猜测.
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |