2015-05-26 1 views
0

Я хочу общий базовый класс, который можно смешать в некоторых чертах.Автоматически выводимый общий тип в признаке

Возможно ли, что микшины автоматически принимают общий тип базового класса?

abstract class Base[T] { 
    def foo: T = ??? 
    def bar(value: T): Boolean 
} 

trait MixinA { 
    self: Base[U] => // U should be automatically bound to T of Base[T] 
    def bar(value: U): Boolean = false 
} 

ответ

1

Вы можете достичь чего-то приближается это с помощью абстрактного типа в Base: тест

abstract class Base[T] { 
    type U <: T 
    def foo: U = ??? 
    def bar(value: U): Boolean 
} 

trait MixinA { 
    self: Base[_] => 
    final def bar(value: U): Boolean = false 
} 

REPL:

scala> class Impl extends Base[Int] with MixinA 
defined class Impl 

scala> val i = new Impl 
i: Impl = [email protected] 

scala> val x: Int = i.foo 
scala.NotImplementedError: an implementation is missing 
    at scala.Predef$.$qmark$qmark$qmark(Predef.scala:225) 
    at Base.foo(<console>:9) 
    ... 33 elided 

Как вы можете видеть, что компилятор правильно определил, что i.foo является подтип Int (конкретно, это isInt) и поэтому может быть присвоено x (исключение здесь просто потому, что e вы оставили свое тело незавершенным).

0

В этом случае вам нужно U быть параметром типа вашего MixinA.

trait MixinA[U] { self: Base[U] => ... 

параметров типа таким образом, как параметры функции, если они объявлены вам нужно передать их куда-нибудь (без магии).

+0

Я хочу, чтобы не было необходимости указывать общий тип явно для mixin еще раз: 'new Base [Int] с MixinA', а не' new Base [Int] с MixinA [Int] ' – lucien

+0

Имея параметр типа' U '' в 'MixinA' требуется, чтобы он мог работать с соответствующим образом параметризованным базовым признаком. В противном случае используйте элемент типа. – cchantep

Смежные вопросы