복붙노트

[SCALA] 유형 매개 변수 대 추상 유형

SCALA

유형 매개 변수 대 추상 유형

어떤 상황이 추상적 인 유형의 유형 매개 변수보다 선호되어야 하는가?

해결법

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

    1.추상 형 대 매개 변수에 대한 내 이전의 대답에 추가하려면, 당신은 또한 JESSE EICHAR의 최근 블로그 게시물 (2010 5월 3일) 몇 가지 중요한 차이점을 강조 있습니다 :

    추상 형 대 매개 변수에 대한 내 이전의 대답에 추가하려면, 당신은 또한 JESSE EICHAR의 최근 블로그 게시물 (2010 5월 3일) 몇 가지 중요한 차이점을 강조 있습니다 :

    trait C1[A] {
      def get : A
      def doit(a:A):A
    }
    trait C2 {
      type A
      def get : A
      def doit(a:A):A
    }
    

    C2의 경우, 파라미터 (내부 추상 형으로) "매장"이다. (이 실제로 매장되지 않으며, retronym 둔다으로, 그것을 제외시켰다 아래 참조)

    일반적인 유형 반면, 매개 변수는 명시 적으로 사용하기로하는 입력을 알고 다른 표현을 돕는 언급

    (즉, 파라미터 C1) : 그래서

    //compiles
    def p(c:C1[Int]) = c.doit(c.get)
    

    그것은 컴파일하지만 당신은 'A'가 사용하려는 유형을 명시 적으로 노출됩니다.

    그리고 (C2 : 추상 형) :

    // doesn't compile
    def p2(c:C2) = c.doit(c.get)
    <console>:6: error: illegal dependent method type
           def p2(c:C2) = c.doit(c.get)
                  ^
    

    'A'는 P2의 정의에서 언급 한 적이 있기 때문에 작은 동전이 그것을 반환하도록되어 무엇을 컴파일 유형에서 모르는, 그래서 그것은 컴파일되지 않습니다.

    추상 형식을 사용하지 않도록하고자 할 때 어떤, 당신은 P2에 대한 반환 등 매우 일반적인 유형을 지정할 수 있습니다 (즉 실제로 'A'는 무엇을 노출하고 싶은) 인터페이스에 "누출 입력"

    // compiles because the internals of C2 does not leak out
    def p(c:C2):Unit = c.doit(c.get)
    

    또는 당신은 "수정"는 작은 동전 기능에 직접 해당 유형의 수 : DEF 작은 동전 (a : A), (: A A) : A, 수단 대신 DEF 작은 동전의 지능 : 데프 P2 (C : C2) = c.doit (c.get) (P2는 어떤 반환 형식을 언급하지 않는 경우에도) 컴파일

    마지막으로 (retronym의 코멘트) 당신은 정제 C2 추상적 인 매개 변수 중 하나를 명시 적으로 지정할 수 있습니다 :

    scala> def p2(c:C2 { type A = Int }): Int = c.doit(c.get)
    p2: (c: C2{type A = Int})Int
    

    또는 유형 매개 변수를 추가하여 (그리고 그것으로 C2 추상 형식을 정제!)

    scala> def p2[X](c:C2 { type A = X }): X = c.doit(c.get)
    p2: [X](c: C2{type A = X})X
    

    그래서 추상적 권장합니다 :

    단순 유형의 인스턴스가 필요하다 나머지를 들어, 매개 변수 사용합니다. (: 인 매개 변수 종류가 무엇인지는 더 확장이 필요하지 않을 것이라는 점을 알고있다,하지만 당신은 여전히 ​​몇 가지 유형을 처리해야하는 경우)

    retronym 추가한다 :

    주요 차이점은

    (여기 예시로서 :

    trait T1 {
      type t
      val v: t
    }
    trait T2 extends T1 {
      type t <: SomeType1
    }
    trait T3 extends T2 {
      type t <: SomeType2  // where SomeType2 <: SomeType1
    }
    class C extends T3 {
      type t = Concrete    // where Concrete <: SomeType2
      val v = new Concrete(...)
    }
    

    )

  2. from https://stackoverflow.com/questions/3170821/abstract-types-versus-type-parameters by cc-by-sa and MIT license