[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.당신과 함께 단순히 문제를 재현 할 수 있습니다 :
당신과 함께 단순히 문제를 재현 할 수 있습니다 :
val x: AnyRef = 42
여기에 변화를 도입하는 것이 GitHub의에서 관련 끌어 오기 요청입니다
이론적 근거는 보안상의 이유로 일부 암시 적 변환이 U이 경우 사용할 수 없습니다에 변환이 T에서 이동, 즉 때, 명시 적으로 사용할 수 있다는 것입니다 :
T <: Null
또는
AnyRef <: U
특정 경우에, 지능이이 수단 (AN AnyRef이하지 않은) AnyRef로 변환되지 않습니다.
당신은 지능과 문자열을 모두 수용해야하는 경우, 대신 모든 수용 고려할 수 있습니다. 모든에서 모든 스칼라 객체 상속 때문에, 필요하지 암시 적 변환은 없습니다.
def h(a: Any*) = a.mkString(",")
-
==============================
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.이 같은 작업을 수행하여 AnyRef로 변수를 캐스트 :
이 같은 작업을 수행하여 AnyRef로 변수를 캐스트 :
h(1.asInstanceOf[AnyRef], 2.asInstanceOf[AnyRef])
왜?
스칼라에서는 모든 것이이 방식은 자바에서와 있다는 점에서 (AnyRef 일명) 객체를 확장합니다. 특히 프리미티브 함수가 AnyRef 당신이 / 캐스트 / 변환해야 당신의 스칼라 변수를 제한 할 것을 요구 그렇다면, AnyVal을 확장합니다.
좋은 토론은 여기있다 : 무엇 모든, AnyVal, AnyRef 개체 사이의 관계는 자바 코드에서 사용될 경우 어떻게지도 하는가?
-
==============================
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 될 필요가 있음을 호출합니다.
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
'SCALA' 카테고리의 다른 글
[SCALA] 스파크 RDD의 배 방법의 설명 (0) | 2019.11.07 |
---|---|
[SCALA] TimeoutException을 수신 가능한 이유는 무엇입니까 : 선물은 [n 초] 후 시간 초과 스파크로 작업 할 때 [중복] (0) | 2019.11.07 |
[SCALA] 왜 SimpleDateFormat의 잘못된 날짜를 구문 분석 하는가? (0) | 2019.11.07 |
[SCALA] 어떻게 목록 Column.isin를 사용 하는가? (0) | 2019.11.07 |
[SCALA] 미래의 내 보낸 (0) | 2019.11.07 |