내가 기본 클래스가 있다고 가정특성과 추상적 인 유형
abstract class Base {
type B<: Base
def rep:String
def copy:B
}
class MyBase(override val rep:String) extends Base {
type B = MyBase
override def copy = new MyBase(rep)
}
그때 사본이 (호출하는 적절한 유형 의미가 될 수 있도록 내가 반환 형식을 원하는에 대한 믹스 인, 같은 다른 특성을 추가하려고 mixin의 copy는 B를 적절한 유형으로 설정하여 mixin 유형을 반환합니다). 나는 이것을 컴파일 할 수 없었고 심지어 override 키워드가 어디로 가야 하는지를 이해할 수 없었다.
편집 : 나는 적절한 타입 B를 선언하고 사본은 DecBase을 반환하도록, DecBase에 대한 방법을 복사하고, 또한, 왜 '수상 어떻게
abstract class Base {
type B <: Base
def rep:String
def copy:B
}
class MyBase(val rep:String) extends Base {
type B = MyBase
def copy = new MyBase(rep)
}
trait DecBase extends Base {
abstract override def rep = "Rep: "+super.rep
}
내 질문은 예를 정제 한 이 컴파일?
println(((new MyBase("ofer") with DecBase)).rep)
이것은 자바에서 성취했을 것입니다. 재귀 적 제네릭 유형을 사용하면 다소 불쾌합니다. 나는 Scala에서 더 좋은 것을 할 수 있다고 확신한다. 사용
편집
는
trait DecBase extends Base {
override type B = DecBase
abstract override val rep= "Dec:"+super.rep
abstract override def copy = new MyBase(rep) with DecBase
}
나는
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
println(((new MyBase("ofer") with DecBase)).rep)
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
abstract override def copy = new MyBase(rep) with DecBase
나는 질문을 세련했다. – user44242
다시 편집하여 이번에는 컴파일러 오류가 발생했습니다. 중요한 것은 copy 메소드의 올바른 리턴 유형입니다. – user44242
이제 문제가 발생합니다. DecBase는 MyBase의 하위 유형이 아니므로 B를 B로 대체 할 수 없습니다. 하지만이를 수정 한 후에도 여전히 오류가 발생합니다. 컴파일러는 B = MyBase 유형을 무시하는 것 같지 않지만 다른 것일 수 있습니다. – sblundy