[SCALA] 무엇 스칼라의 매니페스트이며, 당신이 그것을 할 때 필요합니까?
SCALA무엇 스칼라의 매니페스트이며, 당신이 그것을 할 때 필요합니까?
스칼라는 2.7.2 이후 자바 타입의 삭제에 대한 해결 방법입니다 매니페스트라는 것이 있습니다. 그러나 정확히 어떻게 매니페스트 작업을 수행하는 이유 / 때 당신은 그것을 사용해야합니까?
블로그 포스트 매니페스트 : 호르헤 오티즈에 의해 구체화 유형 그것의 일부를 설명하지만, 상황에 맞는 범위와 함께 사용하는 방법에 대해 설명하지 않습니다.
또한, ClassManifest은 무엇인가, 매니페스트과의 차이점은 무엇입니까?
나는 몇 가지 코드가 삭제를 입력 할 수와 관련하여 몇 가지 경고를 가지고 그 (큰 프로그램의 일부를 쉽게 여기 포함 할 수 없습니다) 나는 매니페스트를 사용하여 이러한를 해결할 수 있습니다 생각,하지만 난 정확히 모르겠어요.
해결법
-
==============================
1.컴파일러는 쉽게 나타낼 수있는 JVM 런타임에 비해 유형에 대한 자세한 정보를 알고있다. 매니페스트가 손실 된 유형에 대한 정보를 런타임에 코드 차원 간 메시지를 보낼 수있는 컴파일러를위한 방법입니다.
컴파일러는 쉽게 나타낼 수있는 JVM 런타임에 비해 유형에 대한 자세한 정보를 알고있다. 매니페스트가 손실 된 유형에 대한 정보를 런타임에 코드 차원 간 메시지를 보낼 수있는 컴파일러를위한 방법입니다.
이것은 Kleptonians 화석 기록과 인간의 '정크'DNA에 인코딩 된 메시지를 떠난 방법과 유사하다. 광속 및 중력 공명 필드의 제한으로 인해, 그들은 직접 통신 할 수 없습니다. 어떻게 자신의 신호로 조정에 알고있는 경우 그러나, 당신은 재생하는 점심이나되는 로또 번호를 무엇을 먹고 결정에서, 당신이 상상할 수없는 방법으로 혜택을 누릴 수 있습니다.
매니페스트 (manifest) 자세한 내용을 모르고 당신이보고있는 오류를 도움이 될 경우에 명확하지 않다.
매니페스트의 한 일반적인 사용은 다른 컬렉션의 정적 유형에 따라 코드 동작합니다을하는 것입니다. 예를 들어, 목록의 다른 유형에서 다른 목록 [문자열]을 치료하기 위해 무엇을 원하는 경우 :
def foo[T](x: List[T])(implicit m: Manifest[T]) = { if (m <:< manifest[String]) println("Hey, this list is full of strings") else println("Non-stringy list") } foo(List("one", "two")) // Hey, this list is full of strings foo(List(1, 2)) // Non-stringy list foo(List("one", 2)) // Non-stringy list
이에 대한 반사 기반 솔루션은 아마도리스트의 각 요소를 검사 포함한다.
바인딩 컨텍스트는 스칼라 타입 클래스를 사용하여 가장 적합한 것, 그리고 잘 Debasish 고쉬가 여기에 설명되어 있습니다 : http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
컨텍스트 경계는 단지 메소드 서명을 더 읽기 쉽게 만들 수 있습니다. 예를 들어, 상기 함수는 문맥과 같이 경계를 사용하여 재기록 될 수있다 :
def foo[T: Manifest](x: List[T]) = { if (manifest[T] <:< manifest[String]) println("Hey, this list is full of strings") else println("Non-stringy list") }
-
==============================
2.매니페스트와 ClassManifest의 차이에 관한 아니 완벽한 대답하지만, 당신은 스칼라 2.8 배열 종이에서 예를 찾을 수 있습니다 :
매니페스트와 ClassManifest의 차이에 관한 아니 완벽한 대답하지만, 당신은 스칼라 2.8 배열 종이에서 예를 찾을 수 있습니다 :
예:
def tabulate[T](len:Int, f:Int=>T)(implicit m:ClassManifest[T]) = { val xs = new Array[T](len) for (i <- 0 until len) xs(i) = f(i) xs }
(그림이 SO 질문을 참조)
def tabulate[T: ClassManifest](len:Int, f:Int=>T) = { val xs = new Array[T](len) for (i <- 0 until len) xs(i) = f(i) xs }
-
==============================
3.매니페스트는 타입 삭제가 (제네릭을 지원하지 않는)를 JVM에서 실행할 수 일반적인 유형을 구체화하도록했다. 그들도 단순했고, 완전히 스칼라의 타입 시스템을 지원 할 수 없습니다 : 그러나, 그들은 몇 가지 심각한 문제가 있었다. 따라서 이들은 스칼라 2.10에서 사용되지 않는, 그리고 (스칼라 컴파일러 자체가 유형을 나타내는 데 사용하는, 따라서 완전히 스칼라 유형을 지원하는 것을 본질적으로) TypeTags로 대체됩니다. 차이에 대한 자세한 내용은 다음을 참조하십시오
매니페스트는 타입 삭제가 (제네릭을 지원하지 않는)를 JVM에서 실행할 수 일반적인 유형을 구체화하도록했다. 그들도 단순했고, 완전히 스칼라의 타입 시스템을 지원 할 수 없습니다 : 그러나, 그들은 몇 가지 심각한 문제가 있었다. 따라서 이들은 스칼라 2.10에서 사용되지 않는, 그리고 (스칼라 컴파일러 자체가 유형을 나타내는 데 사용하는, 따라서 완전히 스칼라 유형을 지원하는 것을 본질적으로) TypeTags로 대체됩니다. 차이에 대한 자세한 내용은 다음을 참조하십시오
스칼라 2.10가 출시 된 2013년 1월 4일, 전에.
-
==============================
4.의는 스칼라 소스 (Manifest.scala)에서 매니페스트를 확인해 보자, 우리는 다음을 참조하십시오
의는 스칼라 소스 (Manifest.scala)에서 매니페스트를 확인해 보자, 우리는 다음을 참조하십시오
Manifest.scala: def manifest[T](implicit m: Manifest[T]) = m
다음 예제 코드에 관해서 그래서 :
def foo[A](somelist: List[A])(implicit m: Manifest[A]): String = { if (m <:< manifest[String]) { "its a string" } else { "its not a string" } }
우리의 예시적인 코드가 [문자열]이었다 매니페스트에 제공하는 입력 파라미터를 만족 [T] 매니페스트 우리는 매니페스트 함수 암시 m 검색 것을 알 수있다. 그래서 당신은 뭔가를 호출 할 때 :
if (m <:< manifest[String]) {
당신은 당신이 당신의 기능에 정의 된 현재의 암시 m 유형 매니페스트 [문자열]의 경우 확인하고 매니페스트로 유형 매니페스트 [T]의 기능은 특정 매니페스트 [문자열]을 검색 할 것이며,이 경우 찾을 것입니다 거기 이러한 암시한다.
from https://stackoverflow.com/questions/3213510/what-is-a-manifest-in-scala-and-when-do-you-need-it by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라에서,는 "초기 초기화"무엇인가? (0) | 2019.10.30 |
---|---|
[SCALA] JVM은 로컬 호스트의 IP 주소를 해결하는 데 시간이 오래 걸립니다 (0) | 2019.10.30 |
[SCALA] 어떻게 표준 스칼라 클래스를 사용하여 스칼라에서 JSON을 구문 분석? (0) | 2019.10.30 |
[SCALA] 스파크에서 층화 추출법 (0) | 2019.10.30 |
[SCALA] 튜플에 스칼라 목록을 변환? (0) | 2019.10.30 |