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))

Как я могу это сделать?

Я знаю, что есть много постов по темам, близким к этому, но я не могу понять это.

0 ответов

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