2016-10-30 3 views
1
def getManifest[T : Manifest] = implicitly[Manifest[T]] 

class A[T] 
object A { 
    def apply[T] = new A[T] 
} 
def getA[T : A] = implicitly[A[T]] 

val m = getManifest[Int] 
//res0: Manifest[Int] = Int 

val a = getA[Int] 
//<console>:14: error: could not find implicit value for evidence parameter of type A[Int] 

스칼라에서 어떻게 매니페스트가 컨텍스트에서 암시 적으로 기능 할 수 있습니까?

상황

에서 암시 적 변수가 getManifest[Int]를 호출하여이 없다하더라도, 유형 Manifest[Int]m 암시 caputred됩니다


그러나 내 사용자 정의 클래스 A는 getA[Int] 오류가 방출

cotext에 암시 적 변수가 없으므로.


무엇 클래스 A와 매니페스트

의 차이는 스칼라 컴파일러에 대한 매니페스트가 알고 않습니다이며 마법을 ???

은 매니페스트에 대한 암시 적 변수를 만듭니다.

답변

2

짧은 대답은 yes입니다. Manifest은 스칼라 컴파일러가 필요할 때 유형의 암시 적 인스턴스를 자동으로 작성하는 컴파일러 마술입니다. 그것들은 JVM에서 타입 지우기를 수행하는 데 사용됩니다 (실행시 일반 타입이 지워지므로 예를 들어 List[Int]List[String]과 같습니다).

자세한 내용은 What is a Manifest in Scala and when do you need it?을 참조하십시오.

그들은 또한 지금은 TypeTags에 찬성하여 더 이상 사용되지 않습니다.

+0

감사합니다. 귀하의 답변은 매우 유용합니다. 내 맞춤 클래스 A를 Manifest처럼 작동시킬 수 있습니까? –

+1

일부 용도는'TypeTag's로, 다른 것은'ClassTag's로 대체해야합니다. –

+0

@WonpyoPark, 아니요, 암시 적 변환이 가능할지라도 원하는대로 얻을 수 있습니다. 특히 컴파일러에게 어떤 타입의'T '로부터'A'를 얻는 방법을 알려줄 필요가 있으며, 그것을하는 한가지 방법은 암시적인 변환을 통해서입니다. – badcook