2016-09-23 2 views
0

Мне нужно создать экземпляр класса Scala с использованием отражения.Искажение аргумента конструктора класса конструктора Scala

Я хочу использовать конструктор класса по умолчанию, который имеет аргументы со значениями по умолчанию, поэтому мне нужно получить эти значения по умолчанию.

Значения по умолчанию в Scala - это просто методы в JVM, поэтому мне нужно получить все методы класса и вызвать только те, которые возвращают значения по умолчанию.

Вопрос: Я вижу, что есть два различных соглашения об именовании методов, которые возвращает значения ARG по умолчанию - «применить $ по умолчанию $ X» и «$ lessinit $ больше $ по умолчанию $ X» (где X представляет собой число позиций конкретного аргумента). В чем разница между этими двумя? Возможно, это зависит от версии Scala или чего-то еще?

ответ

1

Если вы объявляете случай, класс

case class Foo(bar: Int) 

, то это создает как обычный класс и сопутствующий объект:

class Foo(bar: Int) { // def toString, hashCode, equals 
} 
object Foo { 
    def apply(bar: Int) = new Foo(bar) 
    // def unapply 
} 

Конечно, если у вас есть значения параметров по умолчанию, как конструктор и метод apply должен использовать эти значения по умолчанию; любое другое поведение было бы весьма неожиданным.

Значения по умолчанию для конструктора возвращаются $lessinit$greater$default$X методами (поскольку имя конструктора равно <init>). apply$default$X - значения по умолчанию для метода apply.

Для классов, отличных от случая, вы должны видеть только $lessinit$greater$default$X, если вы сами не определяете метод apply.

+0

Я понял, спасибо! –

+0

Но дополнительный вопрос: почему существуют два разных метода значений по умолчанию для apply() и ? Если я объявляю класс Foo (bar: Int = 0), то объект-компаньон должен также использовать это конкретное значение, а два метода - только шаблон. –

+0

Я предполагаю, что это просто, чтобы не сделать это особым случаем. При вводе вызовов метода значения по умолчанию компилятор в настоящее время должен знать имя метода и подпись. –

Смежные вопросы