Есть ли какой-нибудь способ, которым я могу узнать тип объекта, хранящегося как Any, и преобразовать его в этот тип?
Это на самом деле не имеет смысла.Предположим, я мог бы сделать это, и это выглядит так:
val func = funcs(func_name).toAppropriateType
Что теперь?
func
теперь содержит значение некоторого неизвестного типа.Я могу назвать это ... но я не знаю его подписи, так какие аргументы я передаю?И тип / подпись будет отличаться при каждом вызове (в зависимости от того, что было извлечено из карты), поэтому код для его вызова должен быть разным для каждого вызова;Мне нужен какой-то способ выполнения разного кода для каждой возможности func
... но это будет совпадение с шаблоном!И он должен был бы учитывать каждый возможный тип, точно так же как совпадение на Any
.
На самом деле, магический метод toAppropriateType
, даже если он мог существовать, не дает мне ничего поверх просто с помощью Any
.Это все еще тот случай, когда единственное, что я могу сделать с func
, это то, что вы можете делать со всеми значениями каждого возможного типа (т. Е. Очень мало).
В общем, когда вычтобы взять что-то из коллекции, вы должны обработать это кодом, действительным для всего, что позволяет тип помещать в коллекцию .Единственная альтернатива - использовать такие функции, как asInstanceOf
, который отбрасывает гарантии системы типов и возлагает ответственность за то, чтобы вы не использовали неправильный тип;Это означает, что у вас должен быть какой-то другой способ узнать, какой тип ожидать вне системы типов.
Если вы хотите иметь набор функций с одним из заранее определенных наборов сигнатур, тогда лучший способзаключается в создании типа, который допускает только эти сигнатуры и позволяет определить разницу между ними (например, предложение Рекса Керра об использовании Either
).Переход на использование Any
, как только вы обнаружите, что вам нужно объединить вещи разных типов в коллекции, обычно вызывает больше проблем, чем решает.