복붙노트

[SCALA] 위 유형 경계에서 작동하지 않는 추상 형식을 무시 케이크 패턴

SCALA

위 유형 경계에서 작동하지 않는 추상 형식을 무시 케이크 패턴

하지 =로 : 나는 추상적 인 특성과 함께 <입력 무시하려면 (여기에 답 스칼라 상한 등을 : 값이 형식 매개 변수의 멤버가 아닙니다).

나는 케이크 패턴을 사용하기를 원하지만이없는 작업을 수행, 난 왜 이해가 안 돼요?

trait A {
  def ping = println("ping")
}

trait Cake {
  type T
}

trait S { this: Cake =>
  type T = A
  def t: T
  t.ping
}

OK,이 예제를 실행,하지만 내 실제 사용 사례에 난 <와 유형을 대체하려면 :하지와 = .IT 이유는 t 기능에 액세스 할 수없는 것?

trait S { this: Cake =>
  type T <: A
  def t: T
  t.ping
}

오류 값 핑이 S.this.T의 구성원이 아닌 반환

해결법

  1. ==============================

    1.그것은 스칼라의 타입 시스템의 단점입니다. 믹스 인의 회원을 결정할 때, 스칼라는이 규칙을 사용합니다 : 첫째, 콘크리트 항상 추상적 우선합니다. 둘째, 두 멤버는 콘크리트, 또는 선형화 주문 승리 이후에 오는 두 추상, 다음 하나 둘 경우.

    그것은 스칼라의 타입 시스템의 단점입니다. 믹스 인의 회원을 결정할 때, 스칼라는이 규칙을 사용합니다 : 첫째, 콘크리트 항상 추상적 우선합니다. 둘째, 두 멤버는 콘크리트, 또는 선형화 주문 승리 이후에 오는 두 추상, 다음 하나 둘 경우.

    또한, 자기 특성은 유형

    trait S { this: C => ... }
    

    암시 적으로 증강된다

    trait S { this: S with C => ... }
    

    그래서 형질 S의 정의는 귀하의 경우에는 S. 내에서 액세스 할 수 있는지, 형질 S는 다음과 같이 볼 수있다 :

    trait S { this: S with Cake =>
      type T = A
      def t: T
      t.ping
    }
    

    이 케이크의 추상적 인 T보다 우선하기 때문에 이제 한 T 콘크리트와 같이이 괜찮습니다. T는 추상적 인 경우에, 케이크의 하나는 선형화 순서와 승리 이후에 cames. 그리고 T는 상한, 그래서 멤버 핑을하지 않습니다. 이 문제를 해결하는 한 가지 방법은 서면에 의해 선형화 순서를 변경하는 것입니다 :

    trait S { this: Cake with S =>
      type T <: A
      def t: T
      t.ping
    }
    

    스칼라 대신 선형화 순서에 따라 하나의 구성원을 따기의 추상적 인 유형의 모든 구성원 제약은 믹스 인에 병합되는 것을 말한다 다른 규칙이 있다면 그것은 청소기 될 것입니다. 그것은 우리가 미래에 고려할 변화, 그러나 우리는 이전 버전과의 호환성에주의 할 필요가있다.

  2. from https://stackoverflow.com/questions/10213395/cake-pattern-with-overriding-abstract-type-dont-work-with-upper-type-bounds by cc-by-sa and MIT license