代码之家  ›  专栏  ›  技术社区  ›  vihkat

具有布尔泛型的Kotlin继承

  •  9
  • vihkat  · 技术社区  · 8 年前

    当我试图用Boolean、Double、Integer和Float重写泛型方法时,我遇到了一个问题。 它和日期一起工作。(可能是因为它是可序列化的吗?)

    接口:

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

    Abstact实现:(无覆盖剂量测量)

    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
        }
    }
    

    它不起作用:

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

    IDE总是希望实现剂量测量。当我用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
    

    我怎么修? 谢谢你

    更新: 它与Java一起工作。但是为什么不和科特林一起呢?

    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:

    它在vararg可以为空时工作。

    interface AnInterface<C, T> {
        fun doSomething(items: List<T>, vararg value: C?): List<T>
    }
    
    2 回复  |  直到 8 年前
        1
  •  5
  •   Ufkoku    8 年前

    它看起来像Kotlin编译器中的一个bug。我知道,在编译期间,它决定使用基元类型(int)或wrap(integer)。Java泛型不能使用原语,所以编译器使用包作为泛型类型,但是编译器看到,该方法PARAM从不空,并用原始类型替换它,并且出现类型冲突。在这里,nullable可以节省一天的时间。
    但我不确定,只是猜测而已。

        2
  •  1
  •   Roland    8 年前

    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是你在这里能做的最好的事情。