2017-11-04 3 views
1

は、私の知る限り理解し、ScalaではScalaの文字列型推論は

String is an alias for java.lang.String

としては​​を説明し、Predef.scalaで見ることができます。

type String = java.lang.String 

だから、本質的に、それらが同じです。

しかし、のIntelliJ IDEA 2017年2月5日に、以下のコードは、エラー生成します。ここでは

trait PerceptualHash { 
    def calc[A](bi: BufferedImage): A 
} 

sealed trait BinaryStringPerceptualHash extends PerceptualHash { 
    override def calc[String](bi: BufferedImage): String 
} 

private object GeneralBinaryStringPerceptualHash extends BinaryStringPerceptualHash { 
    def calc[String](bi: BufferedImage): String = "0" 
} 

を、"0"が予想タイプに準拠しないjava.lang.String型の発現"のメッセージで下線が引かれます文字列 "。

しかし、私はそうのような"0"を変更した場合:

def calc[String](bi: BufferedImage): String = new String("0") 

その後、私はそのようなエラーメッセージが表示されますありません。

何が起こっているのですか?それは期待された動作ですか(もしそうならば)、私は何か間違っているのでしょうか、それともIntellij IDEAの型推論バグですか?

答えて

2

あなたの署名がcalcの場合、PerceptualHashは、BufferedImageを発信者が要求する任意のタイプに変換できます。例えば。それはとても

def calc[String](bi: BufferedImage): String = "0" 

Stringはあなたが標準Stringタイプとは無関係のパラメータに与えた名前だけです

GeneralBinaryStringPerceptualHash.calc[Int](image) 

を行うには法的です。それはあなたが別のエラーメッセージを取得する必要がありますが、あなたはまだ1を取得する必要があります

def calc[A](bi: BufferedImage): A = "0" 

But if I change "0" like so:

def calc[String](bi: BufferedImage): String = new String("0") 

then I get no such error message.

と同じです。

あなたは、おそらくではなく

trait PerceptualHash[A] { 
    def calc(bi: BufferedImage): A 
} 

// calc is already def calc(bi: BufferedImage): String here, no need to override 
sealed trait BinaryStringPerceptualHash extends PerceptualHash[String] 

たい。

+0

本当にありがとうございます。そして、 'BinaryStringPerceptualHash'の' calc'を無効にすることについてのあなたのコメントは私の心を吹き飛ばします:-)これは型パラメータ化の力です。 – parazs

+0

'BinaryStringPerceptualHash'は、1)共有コードを持っていないか、2)PerceptualHashが' BinaryStringPerceptualHash'かどうかをテストする必要がある場合に特に有用ではないことを付け加えたいと思います。 –

+0

あなたは@AlexeyRomanovですが、私は 'BinaryStringPerceptualHash'を実装したままにして、それを拡張するクラス/オブジェクトを作成します。 – parazs