布尔泛型的Kotlin继承

时间:2018-08-14 07:59:21

标签: android kotlin

当我尝试使用Boolean,Double,Integer,Float覆盖泛型方法时遇到问题。 它与日期一起使用。 (可能是因为它可序列化吗?)

界面:

string

一个抽象的实现:(不重写doSomething)

interface AnInterface<C, T> {
    fun doSomething(items: List<T>, vararg value: C): List<T>
}

正在工作:

abstract class BaseClass<C, T> : AnInterface<C, T> { ... }

它不起作用:

class AnImplementetion<T> : BaseClass<Date, T>() {

    override fun doSomething(items: List<T>, vararg value: Date): List<T> {
            // It works
    }
}

IDE始终希望实现doSomething。当我用IDE实现它时,它总是创建相同的对象。

错误消息:

class AnAnotherImplementetion<T> : BaseClass<Boolean, T>() {

    override fun doSomething(items: List<T>, vararg value: Boolean): List<T> {
            // It doens't
    }
}

我该如何解决? 谢谢

更新: 它适用于JAVA。但是为什么不和Kotlin在一起?

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

更新2:

当vararg可为空时,它起作用。

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

    }
}

2 个答案:

答案 0 :(得分:5)

它看起来像是kotlin编译器中的错误。如我所知,在编译过程中,它决定使用基本类型(int)或自动换行(Integer)。 Java泛型无法与原语一起使用,因此编译器对wrapper泛型类型使用BUT,然后编译器会看到,方法param永远不会为null并将其替换为原始类型,然后出现类型冲突。在这里可以为空可节省一天。
但是我不确定,这只是一个猜测。

答案 1 :(得分:1)

The kotlin reference regarding basic types包含一段内容,解释了其应如何特别处理原始类型和泛型。

显然,后者不能正常工作。当涉及泛型时,应将不使用或编译器错误抱怨的类型装箱。

您应该在https://youtrack.jetbrains.com/处打开一个错误并将其链接到此处。也许这也是一个有意识的设计决定。

一种解决方法是使用可为空的类型Boolean?,因为它将按照参考文献中的描述那样起作用。它会被装箱,因此可以与泛型一起使用。

或者,如果您使用的是JVM,则可以改用java.lang.Boolean。它是原始布尔值的对象类型,即使不鼓励在Kotlin中使用Java类型,也可以采用一种可行的解决方法,直到Kotlin发挥应有的作用。但是,...对其进行测试,Kotlin对其进行了更多的魔术处理,因此其用法也无济于事。然后,您甚至需要强制转换java.lang.Boolean.TRUE as java.lang.Boolean。显然这根本没有帮助。在这里打开bug是最好的方法。

相关问题