向父级添加二级构造函数会意外地影响子类

我有一个(看似)奇怪的问题。 它可以用几行再现:

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(unusedArgument:Int)在Parent中定义

如果其中任何一个是真的,错误消失:

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

说实话,对我来说没有什么意义。 为什么只有在向父类添加非空的二级构造函数时才会发生? 它与什么有什么关系? 这些“修复”究竟是如何解决的?

谢谢。

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

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

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

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