복붙노트

[SCALA] 암시 적 변환의 결과 유형은 AnyRef보다 더 구체적이어야합니다

SCALA

암시 적 변환의 결과 유형은 AnyRef보다 더 구체적이어야합니다

허락하다

def h(a: AnyRef*) = a.mkString(",")
h: (a: AnyRef*)String

h("1","2")
res: String = 1,2

단, H (1,2)

error: the result type of an implicit conversion must be more specific than AnyRef
              h(1,2)
                ^
error: the result type of an implicit conversion must be more specific than AnyRef
              h(1,2)
                  ^

이 스칼라 2.11.1 및 2.11.1 적어도이다. 해결에 요청합니다.

해결법

  1. ==============================

    1.당신과 함께 단순히 문제를 재현 할 수 있습니다 :

    당신과 함께 단순히 문제를 재현 할 수 있습니다 :

    val x: AnyRef = 42
    

    여기에 변화를 도입하는 것이 GitHub의에서 관련 끌어 오기 요청입니다

    이론적 근거는 보안상의 이유로 일부 암시 적 변환이 U이 경우 사용할 수 없습니다에 변환이 T에서 이동, 즉 때, 명시 적으로 사용할 수 있다는 것입니다 :

    T <: Null
    

    또는

    AnyRef <: U
    

    특정 경우에, 지능이이 수단 (AN AnyRef이하지 않은) AnyRef로 변환되지 않습니다.

    당신은 지능과 문자열을 모두 수용해야하는 경우, 대신 모든 수용 고려할 수 있습니다. 모든에서 모든 스칼라 객체 상속 때문에, 필요하지 암시 적 변환은 없습니다.

    def h(a: Any*) = a.mkString(",")
    
  2. ==============================

    2.그 이유는 숫자 형식의 1 리터 및 2 차례로 상관을 확장하는 확장 AnyVal 지능 때문이다. 반면에 문자열 차례로, 모든 확장, AnyRef를 확장합니다. 당신이 AnyVal (INT의 부모)를 참조 할 수 있도록 AnyRef를 확장하지 않습니다. 다음 두 가지 방법 중 하나로이 문제를 해결할 수 있습니다.

    그 이유는 숫자 형식의 1 리터 및 2 차례로 상관을 확장하는 확장 AnyVal 지능 때문이다. 반면에 문자열 차례로, 모든 확장, AnyRef를 확장합니다. 당신이 AnyVal (INT의 부모)를 참조 할 수 있도록 AnyRef를 확장하지 않습니다. 다음 두 가지 방법 중 하나로이 문제를 해결할 수 있습니다.

    네이트에 의해 설명 된 바와 같이 첫 번째로 상관 AnyRef의 유형을 변경한다.

    이들은 java.lang.Object 상위 확장 타입의 java.lang.Integer에 고려되도록 두 번째는 1 리터 및 2에 귀속 형을 사용하고있다. AnyRef는 java.lang.Object 상위 단지의 별칭입니다도 있습니다. 그래서, 다음을 당신의 정의를 사용하여 작동합니다 :

    scala> h(1: java.lang.Integer, 2: java.lang.Integer)
    res2: String = 1,2
    

    스칼라 계층에 대한 자세한 정보

  3. ==============================

    3.이 같은 작업을 수행하여 AnyRef로 변수를 캐스트 :

    이 같은 작업을 수행하여 AnyRef로 변수를 캐스트 :

    h(1.asInstanceOf[AnyRef], 2.asInstanceOf[AnyRef])
    

    왜?

    스칼라에서는 모든 것이이 방식은 자바에서와 있다는 점에서 (AnyRef 일명) 객체를 확장합니다. 특히 프리미티브 함수가 AnyRef 당신이 / 캐스트 / 변환해야 당신의 스칼라 변수를 제한 할 것을 요구 그렇다면, AnyVal을 확장합니다.

    좋은 토론은 여기있다 : 무엇 모든, AnyVal, AnyRef 개체 사이의 관계는 자바 코드에서 사용될 경우 어떻게지도 하는가?

  4. ==============================

    4.난 당신이 여기 AnyRef 사용하려는 생각하지 않습니다. 나는 당신이 어떤을 원하는 생각합니다.

    난 당신이 여기 AnyRef 사용하려는 생각하지 않습니다. 나는 당신이 어떤을 원하는 생각합니다.

    scala> def h(a: Any*) = a.mkString(",")
    h: (a: Any*)String
    
    scala> h(1,2)
    res0: String = 1,2
    

    그 이유는 숫자 값 (5)이 지능이다, 그러나 AnyRef 자바의 객체 등가이다. 그래서 방법 그것은 java.util.Integer 될 필요가 있음을 호출합니다.

  5. from https://stackoverflow.com/questions/26546299/result-type-of-an-implicit-conversion-must-be-more-specific-than-anyref by cc-by-sa and MIT license