복붙노트

[SCALA] 스칼라 일반적인 방법 - T 없음 ClassTag 가능

SCALA

스칼라 일반적인 방법 - T 없음 ClassTag 가능

나는 스칼라 비교적 새로운 해요 및 일반 객체 메소드를 정의하려합니다. 그러나, 나는 "T에 사용할 수 ClassTag"를 얻고 방법 내에서 파라미터 화 된 형태를 참조 할 때. 여기서 문제를 도시하는 인위적인 예이다.

scala> def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
<console>:7: error: No ClassTag available for T
       def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
                                                                        ^

이 인위적인 예를 작동하게하는 방법과 여기에 잘못이 무엇인지 이해하는데 도움에 미리 감사드립니다.

해결법

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

    1.일반 콘텍스트의 배열 (T는 입력 파라미터 T의 배열의 인스턴스)를 인스턴스화하는 스칼라 형 ClassTag [T]의 내재적 값의 형태로, T에 대한 런타임 정보를 가질 필요가있다. 구체적으로, 당신은 (암묵적으로) 편리하게 바인딩 컨텍스트를 사용하여 수행 할 수있는이 ClassTag 값을 전달하는 당신의 방법의 호출자가 필요합니다 :

    일반 콘텍스트의 배열 (T는 입력 파라미터 T의 배열의 인스턴스)를 인스턴스화하는 스칼라 형 ClassTag [T]의 내재적 값의 형태로, T에 대한 런타임 정보를 가질 필요가있다. 구체적으로, 당신은 (암묵적으로) 편리하게 바인딩 컨텍스트를 사용하여 수행 할 수있는이 ClassTag 값을 전달하는 당신의 방법의 호출자가 필요합니다 :

    def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
    

    이 상황의 (철저한)에 대한 설명은이 문서를 참조하십시오

    http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html

    (짧게 말하면, ClassTags은 근거가 남아 있으므로, ClassManifests의 재 작업 구현입니다)

  2. from https://stackoverflow.com/questions/16921168/scala-generic-method-no-classtag-available-for-t by cc-by-sa and MIT license