Я пытаюсь реализовать проект, в котором есть черты:

`trait Checkable`

`trait Closeable`

И класс:

`case class DBConnection (url: String) extends Checkable with Closeable`

И функция

`def generateConnection[T <: Checkable with Closeable](url: String): T = DBConnection(url)`

При компиляции приведенного выше кода возникает ошибка:

`Expression of type DBConnection doesn't conform to expected type T_`

Что я могу сделать, чтобы решить эту проблему?

Я могу использовать выражение:

`DBConnection(url).asInstanceOf[T]`

Но я не думаю, что это лучшая практика

2
miguel0afd 7 Мар 2018 в 17:46

1 ответ

Лучший ответ

Ваш метод говорит, что он вернет T, где T - это подтип Checkable with Closeable. Но затем он возвращает DBConnection. Что, если пользователь вызовет этот метод, параметризованный с помощью MyCustomDBConnection? В результате она ожидала бы того же типа, а вместо этого получила бы ваш DBConnection.

Вы даете обещание, которое не можете сдержать. Лучше отказаться от возможности установить тип T и только пообещать, что вы вернете Checkable with Closeable. Тогда все должно скомпилироваться нормально.

def generateConnection(url: String): Checkable with Closeable = DBConnection(url)

Если вы по-прежнему хотите параметризовать свой метод с помощью T, вам нужно будет создать класс типов, который предоставит разные реализации для разных вариантов T. Вы не можете просто возвращать DBConnection каждый раз, потому что тогда в чем смысл T.

6
slouc 7 Мар 2018 в 18:07