2014-12-02 5 views
0

scala 2.10.4에서 다음 스크립트를 실행합니다. a.classOp의 결과가 MyPage 여야합니다. 왜 아무것도 아닌가?scala 암시 적 매개 변수 유형 추론

scala> trait PageModel { 
| def classOp[T](implicit manifest: Manifest[T]) { 
| println("Class: " + manifest.runtimeClass.getName) 
| } 
| } 
defined trait PageModel 

scala> class MyPage extends PageModel 
defined class MyPage 

scala> val a = new MyPage 
a: MyPage = [email protected] 

scala> a.classOp 
Class: scala.runtime.Nothing$ 

편집 :

는 내가 대답을 얻을 생각합니다. 감사! 그러나 2.9.3에서 실행되는 동일한 코드가 java.lang.Object를 제공한다는 것은 매우 흥미 롭습니다. 같은 행동을해야합니까? 나는 2.9.3에서도 NoManifest를 본다.

scala> trait PageModel{ 
| def classOp[T](implicit m: Manifest[T]) { 
| println("Class: " + manifest[T].erasure.getName) 
| } 
| } 
defined trait PageModel 

scala> class MyPage extends PageModel 
defined class MyPage 

scala> val a = new MyPage 
a: MyPage = [email protected] 

scala> a.classOp 
Class: java.lang.Object 

답변

4

def classOp[T](...)이 정의 할 때 T은 무엇입니까? 그것은 본질적으로 무엇이든 될 수 있으므로 유형의 암시 적 매니 페스트를 요청하고 있습니다 (implicit manifest: Manifest[T]).

val NoManifest = scala.reflect.NoManifest 

NoManifest은 다음과 같습니다 :

object NoManifest extends OptManifest[Nothing] 

그리고 OptManifest은 다음과 같습니다

/** A `OptManifest[T]` is an optional [[scala.reflect.Manifest]]. 
* It is either a `Manifest` or the value `NoManifest`. 

어떤 일이 모든 일이 scala.Predef를 보면

는 다음과 같은 선언을 볼 수 있습니다 이 번역?

Nothing은 모든 유형의 하위 유형이며 범위에 항상 Manifest[Nothing]이 있으므로 (Predef은 항상 범위에 있음)이 항목이 발견되면 암시 적으로 삽입된다는 것을 의미합니다. 답에 대한

trait PageModel[T] { 
def classOp(implicit manifest: Manifest[T]) { 
    println("Class: " + manifest.runtimeClass.getName) 
} 
} 
+0

답변 주셔서 감사합니다! –

1

나는 당신이 지금 a.classOp 그래서 컴파일러는 바닥 유형, Nothing 간다와 T에 채우기 위해 아무것도하지 않기 때문에, 서브 클래스에 PageModel을 매개 변수화하는 의미 생각합니다. 예를 들어

:

scala> a.classOp[String] 
java.lang.String 

난 당신이 MyPage의 클래스 이름을 얻을 수 있었으면했다 있으리라 믿고있어. 이 경우에는 해당 하위 유형에 PageModel을 매개 변수화 할 필요가 다음 REPL classOp 외부 분명히

trait PageModel[T] { 
    def classOp(implicit manifest: Manifest[T]) = 
    println("Class: " + manifest.runtimeClass.getName) 
} 


class MyPage extends PageModel[MyPage] 

val a = new MyPage 

a.classOp // prints "Class: $line11.$read$$iw$$iw$MyPageModel" 

가 더 읽기 FQCN를 인쇄 할 것이다.

+0

감사 :

이와

내가 라이언에 동의하고 아마 할 의미했다! –