将辅助构造函数添加到父级会意外地影响子类

时间:2017-01-30 16:03:16

标签: constructor kotlin

我有一个(看似)奇怪的问题。它只需几行即可复制:

open class Parent(val map: HashMap<String, Any>) {
    // constructor(unusedArgument: Int): this(hashMapOf())
}

class Child: Parent(hashMapOf(Pair("key", "value")))

只要我将Parent的辅助构造函数注释掉,它就会按预期编译并运行。 一旦我把它重新插入,就会弹出这个lint错误,其中调用了Child的父构造函数:

  

错误:无法使用以下函数调用以下函数   提供的参数:

     

在Parent

中定义的公共构造函数Parent(map:HashMap)      

在Parent

中定义的公共构造函数Parent(unusedArgument:Int)

如果其中任何一个为真,则错误消失:

  • 我将差异指定为HashMap<String, out Any>
  • 我的辅助构造函数为空,
  • map被声明为Map而不是HashMap(我不会这样做,因为出于我的目的,我需要它来实现Serializable)。

老实说,这对我来说没什么意义。为什么只有在我将非空辅助构造函数添加到父类时才会发生?什么与任何事情有关?这些&#34;修复&#34;到底是怎么做的?解决它?

感谢。

1 个答案:

答案 0 :(得分:2)

这可能是设计或编译器错误。我建议在Kotlin (KT) | YouTrack报告。

作为一种变通方法,您可以在调用HashMap构造函数时显式声明Parent中使用的泛型类型:

class Child : Parent(hashMapOf<String, Any>(Pair("key", "value")))

我不确定为什么编译器在未定义辅助构造函数时接受HashMap<String, String>HashMap<String, Any>但在定义辅助构造函数时不接受它但有时编译器根本无法推断泛型类型,你需要明确声明它们。