2016-10-16 14 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'' case object Red extend 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 DEF Test1.specificTypes.Value :アプリケーション{ オブジェクトspecificTypes列挙{ 型specificTypes =値 ヴァル赤=値 ヴァルグリーン=値 ヴァルブルー=値 } 抽象クラス外{ タイプTを<延びて延びていますpr(w:T) } class red exte nds outer { T = specificTypes.Red //エラーが発生しました。タイプRedがオブジェクトTest1.specificTypesのメンバーではありません(解決方法) def pr(w:T)= println( "hello red 「) } ヴァルrは=新しい赤 r.pr(Test1.specificTypes.Red) } –