2017-11-04 3 views
1

는 지금까지 내가 이해, 스칼라스칼라 문자열 형식 유추는

String is an alias for java.lang.String

등은 here을 설명하고, 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 유형과 관련이없는 당신이 매개 변수에 준 이름 만입니다

GeneralBinaryStringPerceptualHash.calc[Int](image) 

그래서 String

에서 할 법적이다. 그것은

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