Помимо редкого случая, когда классы предоставляют один и тот же метод, но не связаны и не реализуют общий интерфейс (например, метод close()
- Source
, например, не расширяет Closeable
), Я не вижу смысла для структурных типов с их существующим ограничением.Однако, если бы они были более гибкими, я мог бы написать что-то вроде этого:
def add[T: { def +(x: T): T }](a: T, b: T) = a + b
, которое бы аккуратно обрабатывало числовые типы.Каждый раз, когда я думаю, что структурные типы могут мне чем-то помочь, я бью эту конкретную стену.
РЕДАКТИРОВАТЬ
Каким бы бесполезным я ни находил структурные типы, компилятор , однако, использует его для обработки анонимных классов.Например:
implicit def toTimes(count: Int) = new {
def times(block: => Unit) = 1 to count foreach { _ => block }
}
5 times { println("This uses structural types!") }
Объект, являющийся результатом (неявного) toTimes(5)
, имеет тип { def times(block: => Unit) }
, то есть структурный тип.
Я не знаю, делает ли Scalaчто для каждого анонимного класса - возможно, так и есть.Увы, это одна из причин медленного выполнения pimp моей библиотеки, так как структурные типы используют рефлексию для вызова методов.Вместо анонимного класса следует использовать реальный класс, чтобы избежать проблем с производительностью в моей библиотеке pimp.