Почему я могу пометить методы как неявные, но не как конструктор?

Общий шаблон Enrich-My-Library выглядит примерно так

class Foo(value: Int)

implicit def int2Foo(i: Int) = new Foo(i)

Почему нельзя просто добавить implicit самому конструктору, как это

class Foo implicit (value: Int)

учитывая, что конструктор не намного больше, чем метод с некоторыми дополнительными ограничениями?

Удивительно, но следующее работает:

class Foo(value: Int) {
  implicit def this(a: String) = this(a.toInt)
}

1 ответ

Решение

Если я правильно понимаю ваш вопрос (см. Мой комментарий выше), что вы думаете о том, чтобы это:

implicit class Foo(val i : Int) {
 ...
}

Будет составлять:

implicit def int2Foo(x : Int) = new Foo(x)
class Foo(val i : Int) {
 ...
}

Если вы имеете в виду не только унылость, то, возможно, вам нужно подумать над этой проблемой, чтобы избежать чрезмерной сложности семантики объявления конструктора.

Но что касается мелкомасштабного добавления синтаксиса, это было предложено и получило нюансы, но относительно положительные комментарии от Мартина Одерского, но у меня пока нет новостей по реализации.

Другие вопросы по тегам