2016-10-16 4 views
1
object Test1 extends App { 

    object specificTypes extends Enumeration { 
    type specificTypes = Value 
    val Red = Value 
    val Green = Value 
    val Blue = Value 
    } 

    abstract class outer { 
    type T <: Test1.specificTypes.Value 
    def pr(w: T) 
    } 

    class red extends outer { 
    type T = Test1.specificTypes.Red // Getting Error Here, type Red is not a member of object Test1.specificTypes 
    def pr(w: T) = println("hello red") 
    } 

    val r = new red 
    r.pr(Test1.specificTypes.Red) 

} 

유형 레드 개체 Test1.specificTypes의 구성원이 아닌, 그것을 해결하는 방법, 나는 당신이 원하는 경우 동반자 객체의 타입 T를 저장하는 것이 좋습니다 생각유형 매칭

+1

여기에서 달성하려는 것은 무엇입니까? 더 많은 정보가 필요합니다 – pamu

+0

일반적으로 ADT를 사용합니다 :'sealed trait Colour'' 사례 오브젝트 Red Extour Colour' 등 ... –

+0

타입이있는 클래스가 있습니다. 클래스를 구분하고 싶습니다. 패턴 일치 유형으로 –

답변

0

type T = Test1.specificTypes.Red 유형을 지정하지 않습니다. 값을 유형으로 지정하려고 시도하지만 컴파일되지 않습니다.

어때요? 나는 유형의 몇 가지 수업을

(당신이 언급 한 같은) 당신이 경우에, 나는

내가 사용하는 것이 일치하는 패턴을 입력하여 클래스를 구별 할

object Test1 extends App { 


    object specificTypes extends Enumeration { 
    type specificTypes = Value 
    val Red = Value 
    val Green = Value 
    val Blue = Value 
    } 

    abstract class outer { 
    type T <: Test1.specificTypes.Value 
    def pr(w: T) 
    } 

    class red extends outer { 
    type T = Test1.specificTypes.Red.type //IMPORTANT THING! 
    def pr(w: T) = println("hello red") 
    } 
    class blue extends outer { 
    type T = Test1.specificTypes.Blue.type //IMPORTANT THING! 
    def pr(w: T) = println("hello blue") 
    } 

    val r = new red 
    //r.pr(Test1.specificTypes.Blue) // compilation error 
    /* 
    Error:(23, 28) type mismatch; 
    found : Test1.specificTypes.Blue.type (with underlying type Test1.specificTypes.Value) 
    required: Test1.r.T 
     (which expands to) Test1.specificTypes.Red.type 
    r.pr(Test1.specificTypes.Blue) 
    */ 


    val b = new blue 
    b.pr(Test1.specificTypes.Blue) // compiles, prints hello blue 
} 

하지만, 간단한 sealed trait, Chobeat의 답변과 같습니다.

+1

덕분에,이 내 문제를 명확하게, 심지어는 기반 구현을 :) 형질 이동,하지만 난 문제를 명확히 할 –

1

잘못된 갈거야 어디 비슷한 구조를 유지하는 것. 그렇지 않으면 당신은 합계 형식을 사용하고 이상한 유형 참조하지 않고,이

sealed trait Colour 

trait Red extends Colour 

trait Green extends Colour 

class RedClass extends Red 
class GreenClass extends Green 


def matchMethod(check:Colour) = {   

    check match { 

     case Red => println("hello this is red") 
     case Green => println("hello this is green") 
    } 
} 

처럼 철저하고 안전하게 일치시킬 수 있습니다 이런 식으로 뭔가를 할 수 있습니다.

+0

개체 Test1 확장 응용 프로그램은 { 객체 specificTypes는 열거 { 형 specificTypes을 확장 = 값 발 레드 = 값 발 녹색 = 값 블루 = 값 } 추상 클래스 외부 { 유형 T < 발 : Test1.specificTypes.Value 데프 pr (w : T) } 클래스 red exte nds outer { type T = specificTypes.Red // 아래에 오류가 발생했습니다. 빨간색은 Test1.specificTypes 개체의 멤버가 아닙니다. (해결 방법) def pr (w : T) = println ("hello red ") } 발 연구는 = 새 빨간 r.pr (Test1.specificTypes.Red) } –