

Пока Юля с Лёшкой малину собирали, Мишка готовил угли для шашлыка. Я его учил топором работать - сначала щепки тесать, потом брёвна рубить.



println. open class Super(val value: Int) {
constructor(value: Super) : this(value.value)
}
class Sub(value: Int) : Super(value) {
constructor(value: Sub) : super(value)
}Наследник не компилируется, сообщая, что нельзя использовать super в данном контексте, а надо использовать this. Покурив документацию, я всё-таки написал требуемую мне иерархию: class SubOK : Super {
constructor(value: Int) : super(value)
constructor(value: SubOK) : super(value)
}Это не лишено некоторой логики: если определяется конструктор по-умолчанию, то остальные конструкторы должны использовать только его. Во втором случае у класса SubOK нет конструктора по-умолчанию, а оба конструктора равноправны. Но на мой взгляд, логика достаточно спорная, да и добавляет лишнюю строку кода. data class Player(val id: Int,
name: String?,
val solver: Solver? = null) {
val name = solver?.name ?: name ?: "Player ${id + 1}"
}Например, код выше является описанием класса с тремя readonly свойствами id, name и solver, для поддержки которых генерятся методы equals и hashCode. fun count(id: Int) = cells.values().filter { it == id }.size()Да, λямбды поддерживаются. Кстати, тип объекта внутри if определяется автоматически, если в if этот тип проверялся.x in 1..width && y in 1..heightКроме того, мне очень понравились функции расширения. Обычно в Java заводят вспомогательный класс с набором статических методов, а тут можно написать следующим образом:
fun JComponent.getInnerBounds(): Rectangle {
val bounds = Rectangle(getWidth(), getHeight())
val insets = getInsets()
if (insets != null) {
bounds.x += insets.left
bounds.y += insets.top
bounds.width -= insets.left + insets.right
bounds.height -= insets.top + insets.bottom
}
return bounds
}После чего можно использовать этот метод, будто он объявлен в классе JComponent. В целом, поддержка Java отличная.