2016-08-29 2 views
1

を必要と見つけScalaはユニットは、私は以下のいるUnit.type

Error:(8, 21) type mismatch; 
found : Unit 
required: Unit.type 
     (s:String) =>() 

なぜクラスからオーバーライドは、第二次有効ではありませんか?どうすればそれを動作させることができますか? (。あなたの方法からFunction1[String, Unit]を返すことを意味しなかった場合やメソッドへ) -

答えて

4

問題は(s:String) => UnitUnit.typeを返しているということである代わりに(s:String) =>()に変更し

別の言い方をするには、次の

def doSomething = (s:String) => Unit 

は本当にです:

def doSomething: (String) => Unit.type = 
    // A function that takes a string and returns the companion type of Unit 
    (s: String) => Unit 

ながら何おそらくたかったのでした。多分

def doSomething: (String) => Unit = 
    // A function that takes a string and returns Unit 
    (s: String) =>() 

または:

def doSomething(s: String): Unit 
// An abstract method that takes a string and returns nothing. 
+1

確かに、「ユニット」の仲間は混乱を正当化しません。私は実際にユニットの値の構文 '()'がなぜそれのエイリアスでないのか分かりません。 SIP-23は 'Unit.type'と'().type'がその場合同じものであることを確認しやすくしますか? –

+0

* Justify *、no - 値の位置に '(v:T1)=> r:T2'という型の位置で' T1 => T2'を混乱させる人のために 'String =>()' vs '( s:String)=>()//本当に().type'はもっと混乱します。 (あなたが何を意味するのか誤解していない限り)。 –

+1

申し訳ありませんが、私のコメントはあなたの丁寧な回答ではありません。はい、あなたは私を理解しました。私は 'def f():()= println()'と頬を書くのを待つことができません。 (これはコンパイルされません)今のところUnitオブジェクトを削除するだけで偶発的な複雑さを避けることができます。私はOPのための共感を表明したかったのです。 –

1

(s:String) => Unit戻っUnit.typeそれはタイプではなく、その型の値を返します。すなわち。 (s:String) =>()を実行したい場合は、型がUnitの値を返します。

+0

これは正確ではありません。 Unit.typeはユニットのコンパニオンオブジェクトのタイプであり、 'Unit.type'の唯一の値はユニットコンパニオン' Unit'です。 – pedrofurla

+1

それは完全に不正確ではありません。 (つまり、正確ではありません)ハッシュタグの会話には必須ではありません。 –

関連する問題