Scala: экзистенциальный тип и стирание типа
Я не очень знаком со скалами, поэтому надеюсь, что мой вопрос имеет смысл:
У меня есть сложный параметризованный класс, но давайте возобновим его:
class Foo[T] {
def foo(x: T) = {/*do something*/}
}
Теперь в другой части программы я хотел бы построить что-то вроде:
val mylist = List[Foo[_]](new Foo[Int], new Foo[String], ...)
Я хотел бы иметь возможность сделать что-то вроде:
mylist(0).foo(2)
но получить
Несоответствие типов: ожидаемое _$1, фактическое: Int
Я думаю, что это можно решить с помощью TypeTags, но я не смог адаптировать любой материал, который я видел на эту тему. Здесь я хотел бы сказать Foo, что он должен быть параметризован Int.
Более того, в реальном случае я получу переменную:
val x : Any
Я знаю, что он соответствует mylist(i), но я не знаю ни типа Foo[_], расположенного в mylist(i), ни типа x. Все же я хотел бы сделать что-то вроде:
mylist(i).foo(x)
или на мой взгляд (но это вряд ли имеет смысл в скале):
mylist(i).asInstanceOf(Foo[x.getClass]).foo(x.asInstanceOf(x.getClass))
Как я могу это сделать?
Я знаю, что есть много постов по темам, близким к этому, но я не могу понять это.