Динамическое создание объектов в Scala с аргументами - asInstanceOf не принимает параметр - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно динамически создать экземпляр объекта в Scala. Имя класса передается в качестве параметра методу main. Фактический класс, который имеет все методы, импортируется из другого пакета

Я ссылался на решения в ссылках ниже

создание экземпляра объекта с отражением с использованием аргументов конструктора Scala: как динамически создать экземпляр объекта и вызвать метод с использованием отражения?

Мои проблемы в том, что я не могу передать параметр имени класса в asInstanceOf. Ниже приведен код.

import com.xxx.xxx.warehouse.sbi
val classParam = "sbi" //to make it easy, i hardcoded the value.
val constructor = Class.forName(classParam).getConstructors()(0)
val args = Array[AnyRef](String,String)
val instance1 
=constructor.newInstance(args:_*).asInstanceOf[classParam]

Последняя строка в приведенном выше коде выдает ошибку classParam не может быть решена. asInstanceOf потребуется параметр типа T. Мой класс "sbi" имеет так много методов. Но в этом случае, как мне решить эту проблему. Есть несколько классов, похожих на "sbi"

Что я пытаюсь решить:

У меня есть 500 классов дел для импорта из пакета com.xxx.xxx.warehouse. Давайте назовем их sbi1, sbi2, sbi3 ... sbi500. Все эти классы расширяют другой класс, который имеет несколько методов. Есть метод "getLatestVesrion", который находит последнюю версию файла S3 на основе имени класса. Каждый класс дел принимает в качестве входных данных файл S3

Мне нужно получить последнюю версию каждого файла S3 для всех 500 наборов данных в S3, используя вышеуказанные классы. Вместо явного вызова каждого класса я хочу динамически вызывать эти классы в соответствии с необходимостью. Если я вызываю их явно, мне нужно написать 2 строки кода для каждого класса. Итак, я буду передавать имя класса sbi1, sbi2, sbi3 ..sbi500 во время выполнения. В зависимости от имени класса необходимо получить последнюю версию.

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

1 Ответ

0 голосов
/ 08 ноября 2018

Не думаю, что понимаю, чего вы здесь добиваетесь!

Подведем итоги:

  • Фактический тип класса будет известен только во время выполнения

  • Вы пытаетесь привести instance1 в коде, который принудительно вызовет его тип во время компиляции

  • Но если бы вы знали при компиляции, как приводить instance1, вам не понадобился бы параметр runtime для начала!

Я подозреваю, что вы не сможете кастовать instance1 каким-либо образом, потому что во время компиляции не существует известного типа, к которому его можно привести ^^

Если у вас есть своего рода общий интерфейс для всех ваших классов, вы можете подключить его туда, хотя, все должно быть в порядке.

Редактировать: Я думаю, что вы после "классического" рефлекса в конце концов, посмотрите здесь: https://stackoverflow.com/a/39135220/2404988: -)

...