복붙노트

[SCALA] 스칼라 내부 클래스 유형을 참조

SCALA

스칼라 내부 클래스 유형을 참조

DSL에의 모방 다형성 임베딩에 다음 코드 시도가 : 오히려 내부의 동작을 제공하는 것보다, 그것은 그것의 바깥 쪽 클래스의 useInner 방법으로 인코딩된다. 그 사용자가 내부 인스턴스에 대한 참조를 유지하는 경우에만이되도록 둘러싸는 방법을 추가했지만 항상 바깥 인스턴스를 얻을 수 있습니다. 이렇게함으로써, 특정 외부 인스턴스에서 모든 내부 인스턴스는 하나의 행동에 바인딩 (하지만 여기 수배).

abstract class Outer {
  sealed class Inner {
    def enclosing = Outer.this
  }
 def useInner(x:Inner) : Boolean
}

def toBoolean(x:Outer#Inner) : Boolean = x.enclosing.useInner(x)

그것은 컴파일하지 않고 스칼라 2.8에 대한 불평 :

type mismatch; found: sandbox.Outer#Inner
               required: _81.Inner where val _81:sandbox.Outer

중첩 된 클래스와 스칼라의 투어 : 스칼라 프로그래밍에서 내부 클래스, 문제가 특정 외부 인스턴스에서 인수로 그 useInnerexpects 이너 인스턴스 것을 나에게 보인다.

어떻게이 문제를 해결하는 진정한 설명과는 무엇인가?

해결법

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

    1.나는 내부는 형 this.Inner 같다 유형을 가정합니다. 아우터 # 내부는 외부 인스턴스 (경로가 아닌 종속 형) 독립적이다.

    나는 내부는 형 this.Inner 같다 유형을 가정합니다. 아우터 # 내부는 외부 인스턴스 (경로가 아닌 종속 형) 독립적이다.

    abstract class Outer {
      sealed class Inner {
        def enclosing = Outer.this
      }
      def useInner(x:Outer#Inner) : Boolean
    }
    
    def toBoolean(x:Outer#Inner) : Boolean = x.enclosing.useInner(x)
    
  2. ==============================

    2.당신이 설명하는대로 문제는 useInner 특정 외부 인스턴스의 내부를 기대하고 있다는 것입니다. 반환에게 일반적인 외부를 둘러싸고 있기 때문에, 정말 내가 아는 것을 모두 함께 묶어 할 수있는 방법이 없습니다.

    당신이 설명하는대로 문제는 useInner 특정 외부 인스턴스의 내부를 기대하고 있다는 것입니다. 반환에게 일반적인 외부를 둘러싸고 있기 때문에, 정말 내가 아는 것을 모두 함께 묶어 할 수있는 방법이 없습니다.

    당신은하지만, 그것을 강제 할 수 있습니다 :

    def toBoolean(x: Outer#Inner): Boolean = {
      val outer = x.enclosing
      outer.useInner(x.asInstanceOf[outer.Inner])
    }
    
  3. ==============================

    3.또한이처럼 멤버를 정의 할 수 있습니다 :

    또한이처럼 멤버를 정의 할 수 있습니다 :

    def useInner(x:Outer#Inner) : Boolean
    

    또는 당신은 다음과 같이 쓸 수 있습니다 :

    abstract class Outer {
        class InnerImpl {
            def enclosing = Outer.this
        }
        final type Inner = Outer#InnerImpl
        def useInner(x:Inner) : Boolean
    }
    
  4. from https://stackoverflow.com/questions/2183954/referring-to-the-type-of-an-inner-class-in-scala by cc-by-sa and MIT license