2016-10-01 2 views
1
abstract class A { 
    protected[this] type ThisType = this.type 
    protected[this] type OtherType = this.type 

    def assign(other: OtherType): ThisType 
} 

class B extends A { 
    def assign(other: OtherType): ThisType = ??? 
} 

class C extends A { 
    def assign(other: OtherType): ThisType = ??? 
} 

class D extends C { 
    def assign(other: OtherType): ThisType = ??? 
} 

Как мне сделать, что другой тип получил в assign от и объект типа B также B. напримерКак я могу убедиться, что функция получает тот же тип параметра, что и текущий объект?

def f1(p1: A, p2: A) = p1.assign(p2) 
def f2[T <: A](p1: T, p2: T) = p1.assign(p2) 

я получаю следующие ошибки::

Error at p1 Error at p2

NB: На самом деле ThisType и OtherType должны быть одинаковыми, но я отделено их, так что я могу попробовать, как я могу что-то эффективно, как писать из разных вариантов.

+0

Вы хотите тип '' p1' и p2' к быть класса реализации? –

+0

Да. Я хочу, чтобы это был один и тот же класс реализации. –

+0

'ThisType' и' OtherType' предназначены для двух разных типов? –

ответ

1

Одним из способов достижения того, что вы хотите, может быть сделано с помощью Type Projections:

def main(args: Array[String]): T = { 
    f1(new C, new C) 
} 

abstract class A { 
    type ThisType <: A 
    def assign(other: ThisType): ThisType 
} 

class C extends A { 
    override type ThisType = C 
    override def assign(other: C): C = ??? 
} 

class D extends C { 
    override type ThisType = D 
    override def assign(other: D): D = ??? 
} 

def f1[T <: A](p1: T#ThisType, p2: T#ThisType) = p1.assign(p2) 

Другой способ можно использовать F-bound polymorphism:

abstract class A[T <: A[T]] { 
    def assign(other: T): T 
} 

class C extends A[C] { 
    override def assign(other: C): T = ??? 
} 

def f1[T <: A[T]](p1: T, p2: T) = p1.assign(p2) 
+0

Я пытался избежать F-bound polymorphism, поэтому подход Type Projections был тем, чем я был. Вот почему я определил класс, как указано выше, но при условии, что оба они дают ответ. Спасибо за это. –

+0

@ SumindaSirinathS.Dharmasena Приветствую вас. –

+0

У меня есть следующий вопрос: http://stackoverflow.com/questions/39809778/how-do-you-use-type-projections-to-p1-and-p2-are-the-same-type-in- p1-assignp2. Я действительно не могу использовать подпись 'def f1 [T <: A] (p1: T # ThisType, p2: T # ThisType) = p1.assign (p2)' для моей проблемы (хотя это не то, что я в конечном итоге просил в этом вопрос). Я могу только «def run: Unit» –