2016-07-07 2 views
11

사례 유형의 유형을 추상적 유형으로 사용하려고합니다. 내가보고 놀랐습니다 (유사) 아래 코드는 컴파일 : 내 진짜 예 Foo에서유형 바인드로 추상 유형을 구체적으로 설정하는 방법은 무엇입니까?

sealed abstract class Bar 

case object BarOne extends Bar 

case object BarTwo extends Bar 

sealed abstract class Foo { 
    type A <: Bar 

    def f: A 
} 

object Foo { 
    object FooOne extends Foo { 
    type A = BarOne.type 
    val f = BarTwo 
    } 

    object FooTwo extends Foo { 
    type A = BarTwo.type 
    val f = BarOne 
    } 
} 

는 매개 변수화와 케이스 클래스로 사용됩니다. 그래서 나는 단지 A을 타입 매개 변수로 만들 수 없습니다.

ABarOne.type으로 설정하면 f = BarTwo은 어떻게 컴파일됩니까?

A (f: A)이 A <: Bar으로 해석되는 이유는 무엇입니까?

의 각 개체 인스턴스에 대해 A을 구체적으로 설정하는 방법이 있습니까?


저는 스칼라 2.11.8을 사용하고 있습니다.


업데이트 : FooOne & FooTwo 컴파일에 def attributeType = ...val attributeType = ...를 교체 할 때가 실패 (예상대로).

+1

는 실종'FooOne''에 Foo'를 확장하고'오타를 FooTwo'인가? 추가하면 컴파일되지 않기 때문입니다. –

+0

@EndeNeu 그것은 감독이었습니다. 그리고 당신 말이 맞습니다. (예상대로) 컴파일되지 않습니다. 나는 실제 코드에 최대한 가깝게 보이도록 질문을 업데이트했다. 물론 위 코드가 컴파일되지 않고 코드가 컴파일되기 때문에 아무 쓸모가 없습니다. – muhuk

+1

@muhuk 위 코드가 컴파일되지 않으면 컴파일 코드를 나타내지 않습니다. 정확한 질문이없는 한이 질문에 답할 수 없습니다. – Daenyth

답변

1

누구나 현대적인 스칼라 버전으로 업그레이드 할 것을 제안 했습니까?

오버 라이드에 대한 오류로 인해 유형에 적합한 경로가 제공됩니다.

$ scala 
Welcome to Scala 2.12.0-M5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92). 
Type in expressions for evaluation. Or try :help. 

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

sealed abstract class Bar 

case object BarOne extends Bar 

case object BarTwo extends Bar 

sealed abstract class Foo { 
    type A <: Bar 

    def f: A 
} 

object Foo { 
    object FooOne extends Foo { 
    type A = BarOne.type 
    val f = BarTwo 
    } 

    object FooTwo extends Foo { 
    type A = BarTwo.type 
    val f = BarOne 
    } 
} 

// Exiting paste mode, now interpreting. 

<console>:26: error: overriding method f in class Foo of type => Foo.FooOne.A; 
value f has incompatible type 
      val f = BarTwo 
      ^
<console>:31: error: overriding method f in class Foo of type => Foo.FooTwo.A; 
value f has incompatible type 
      val f = BarOne 
      ^

는 버그 this one, 그리고 중복 질문은 from last November입니다.

버그의 성격도 매우 뛰어났습니다. -Yoverride-objects에 의해 소개되었지만 매우 유용하지는 않지만 내 S.O. 대답, 그리고 지금 질문에.

편집 :

$ scala 
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92). 
Type in expressions for evaluation. Or try :help. 

scala> object X ; object Y 
defined object X 
defined object Y 

scala> class C { def f: X.type = X } 
defined class C 

scala> class D extends C { override def f: Y.type = Y } 
defined class D 

scala> :quit 
$ scalam 
Welcome to Scala 2.12.0-M5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92). 
Type in expressions for evaluation. Or try :help. 

scala> scala> object X ; object Y 

// Detected repl transcript. Paste more, or ctrl-D to finish. 

defined object X 
defined object Y 

scala> class C { def f: X.type = X } 
defined class C 

scala> class D extends C { override def f: Y.type = Y } 
defined class D 
// Replaying 3 commands from transcript. 

scala> object X ; object Y 
defined object X 
defined object Y 

scala> class C { def f: X.type = X } 
defined class C 

scala> class D extends C { override def f: Y.type = Y } 
<console>:13: error: overriding method f in class C of type => X.type; 
method f has incompatible type 
     class D extends C { override def f: Y.type = Y } 
             ^
1

나는 여기에서 무슨 일이 일어나고 있는지 모르지만 나는 문제를 조금 더 고립 시켰습니다. 또한 Foo 하위 클래스뿐만 아니라 객체와도 작동합니다. F에서

object BarOne 
object BarTwo 

abstract class Foo[A] { 
    def attributeType: A 
} 

object FooContainer { 
    class FooOne extends Foo[BarOne.type] { 
    val attributeType = BarTwo 
    } 

    object FooTwo extends Foo[BarOne.type] { 
    val attributeType = BarOne 
    } 
} 
+0

감사. 그러나 이것은 답이 아닙니다. – muhuk

+0

그래, 그렇지 않으면 Stack Overflow에서 큰 코드 조각을 얻는 방법을 몰랐다. – robot1208

0
  1. A : :이 scalac 2.11.8에 컴파일 확인했습니다 A는 <로 해석됩니다 : 바
  2. 즉, F는 추상 클래스
  3. 에 정의 될 때이 무엇을 나타내는 지이기 때문에
  4. 추상적 정의를 오버라이드 (override)에 대해 (아래는 컴파일되지 않습니다) 방법 :

    object Foo { 
    
        object FooOne extends Foo { 
        type A = BarOne.type 
        override val f: A = BarTwo 
        } 
    
        object FooTwo extends Foo { 
        type A = BarTwo.type 
        override val f: A = BarOne 
        } 
    
    } 
    
관련 문제