복붙노트

[SCALA] 추상 형식의 멤버 콘크리트 클래스

SCALA

추상 형식의 멤버 콘크리트 클래스

다음과 같은 특성과 수준을 감안할 때. 왜이 컴파일을합니까? 이 실제로 뭔가를 사용할 수 있습니까?

trait Container {
  type A
}

trait AnotherContainer[B]{
    def x(b : B) : B
}

trait Mixed extends Container with AnotherContainer[Container#A]

class Impl extends Mixed{
    def x(a : Container#A) = a 
}

new Impl().x _

scala> new Impl().x _
res0: (Container#A) => Container#A = <function>

최신 정보:

class Baz { type T; }

실제로 기능입니다하지만 난 그것에 대한 의욕 찾을 수 없습니다 : # 1753를.

해결법

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

    1.그것은 나에게 쓸모있는 경우 해가 보인다. 존재하지 않는 당신이 방법에 통과 할 수 있도록 x는, 원한다 유형입니다. 무해 무익은 컴파일 타임 오류가 취향의 문제입니다되어야하는지, 나는 가정한다.

    그것은 나에게 쓸모있는 경우 해가 보인다. 존재하지 않는 당신이 방법에 통과 할 수 있도록 x는, 원한다 유형입니다. 무해 무익은 컴파일 타임 오류가 취향의 문제입니다되어야하는지, 나는 가정한다.

    당신이 실제로 않는 x를 어떻게 보면, 그것은 thusly 히 컴파일 해제 :

    public java.lang.Object x(java.lang.Object);
      Code:
       0:   aload_1
       1:   areturn
    

    신원 방법은 무엇을해야하는지 정확히 인 (반환, 유형에 관계없이 인수를로드). 당신은 훨씬 적은 코드로 뭔가 상당을 쓸 수 있습니다 :

    trait AbstractType { type T }
    class Useless extends AbstractType { def identity(t: AbstractType#T) = t }
    

    아무것도를 제외하고 그래서 다시 우리가 쓸모가, AbstractType # T를 입력있다.

    하지 않는 한 내가 모르는 뭔가가있어.

  2. ==============================

    2.아무것도 <: 당신의 예에서, 컴파일러는>의 기본 유형의 범위를 추가 어느. 보여주는 아래의 두 번째 예는 추상 타입이 가능한 (아니라면 유용함)이되는 경우.

    아무것도 <: 당신의 예에서, 컴파일러는>의 기본 유형의 범위를 추가 어느. 보여주는 아래의 두 번째 예는 추상 타입이 가능한 (아니라면 유용함)이되는 경우.

    scala> trait T { type A >: Nothing <: Any }
    defined trait T
    
    scala> 1: T#A
    <console>:6: error: type mismatch;
     found   : Int(1)
     required: T#A
           1: T#A
           ^
    
    scala> trait T { type A >: Int <: Int }
    defined trait T
    
    scala> 1: T#A                          
    res6: T#A = 1
    
    scala> "": T#A
    <console>:6: error: type mismatch;
     found   : java.lang.String("")
     required: T#A
           "": T#A
           ^
    
  3. from https://stackoverflow.com/questions/2115678/concrete-classes-with-abstract-type-members by cc-by-sa and MIT license