2017-01-30 7 views
0

У меня есть (по-видимому) странная проблема. Это могут быть воспроизведены только с несколькими линиями:Добавление вторичного конструктора к родительскому объекту неожиданно влияет на дочерние классы

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

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

Он собирает и работает, как ожидается, до тех пор, пока я вторичный конструктор Parent «S закомментирована. После того, как я положил его обратно, эта ошибка ворса всплывает где Child «родитель constuctor называется:

Error: None of the following functions can be called with the arguments supplied:

public constructor Parent(map: HashMap) defined in Parent

public constructor Parent(unusedArgument: Int) defined in Parent

ошибка уходит, если какой-либо из этих условий:

  • Уточняю дисперсию в HashMap<String, out Any>,
  • Мой вторичный конструктор пуст,
  • map объявлен как Map вместо HashMap (который я не делаю, потому что для моего мне нужно его реализовать Serializable).

Чтобы быть честным, это не имеет для меня никакого смысла. Почему это происходит, только если я добавляю непустой вторичный конструктор к родительскому классу? Какое это имеет отношение к чему-либо? И как именно эти «исправления» исправить?

Спасибо.

ответ

2

Это может быть дизайн или ошибка компилятора. Я рекомендую сообщить об этом по адресу Kotlin (KT) | YouTrack.

В качестве обходного пути, вы можете явно объявить общие типы, используемые в HashMap при вызове конструктора Parent:

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

Я не уверен, почему компилятор принимает HashMap<String, String> в HashMap<String, Any>, когда вторичный конструктор ISN» t, но не принимает его при определении вторичного конструктора, но иногда компилятор просто не может вывести общие типы, и вам необходимо явно объявить их.

+0

Я предполагал, что у меня что-то не хватает, но да, это, безусловно, похоже на ошибку. Спасибо, я думаю, я расскажу об этом. – SqueezyMo