Предположим, у меня есть трейт SomeTrait с нереализованным методом func. Этот метод вернет что-то, что расширяет SomeTrait. Другими словами, у меня есть что-то вроде следующего:
trait SomeTrait
{
def func(x: Int): SomeTrait
}
Теперь я реализую класс ExtensionClass, который расширяет SomeTrait, и оказывается, что на самом деле я хочу, чтобы реализация func в этом классе возвращала объект типа ExtensionClass:
class ExtensionClass(val param: String) extends SomeTrait
{
override def func(x: Int): SomeTrait = return new ExtensionClass("test")
// ExtensionClass also defines another method not specified in SomeTrait
def anotherMethod: String = return param ++ "!"
}
Пока все вышеперечисленное работает хорошо. Проблема возникает, если я хочу вызвать anotherMethod для объекта, возвращаемого func, вот так:
val extension = new ExtensionClass("hello")
extension.func(5).anotherMethod
Система типов распознает только то, что объект, заданный extension.func(5), имеет тип SomeTrait, поэтому anotherMethod не виден. Это подводит нас к моему вопросу:
Вопрос. Можно ли сделать так, чтобы описанное выше работало без явного приведения/сопоставления с образцом для результата func? Например, могу ли я обновить сигнатуру типа func в SomeTrait, чтобы можно было сделать какой-то вывод типа? Любая помощь будет оценена.