向父级添加二级构造函数会意外地影响子类
我有一个(看似)奇怪的问题。 它可以用几行再现:
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>
时没有定义次构造函数,但在定义次构造函数时不接受它,但有时编译器根本无法推断泛型类型,你需要显式声明它们。