2012-02-15 3 views
0

"제네릭 호출 스택을 다시 명시하는 방법"을 알아낼 수 있다면 (Joshua는 "스칼라 깊이"7.2.2 절에서 설명했듯이) 해당 라인을 따라 B를 인스턴스화 하시겠습니까? :중첩 된 일반 코드의 매니페스트에서 스칼라 인스턴스화

def m1[T](implicit m: Manifest[T]): T = m.erasure.newInstance.asInstanceOf[T] 

class A { 
    def m2[T](implicit m: Manifest[T]): T = m.erasure.newInstance.asInstanceOf[T] 
    def inA() { 
    m1[A] 
    m2[A] 
    m2[B] // Doesn't work... 
    } 
    class B 
} 

m1[A] 
val a = new A 
a.m2[A] 
a.inA() // boom 

또는 일부 뷰 바인딩이 필요합니까?

+1

당신은 무엇을하고 계십니까? 오류가 무엇입니까? 질문은 무엇입니까? –

+0

유형에서 중첩 클래스를 인스턴스화하는 방법은 무엇입니까? 그게 더 좋은 질문입니까? 잊어 버렸습니다 : 저는 스칼라 2.10.0-M1입니다. 오류 : java.lang.InstantiationException : A $ B –

답변

1

내부 클래스 B을 생성하는 것은 내부 클래스의 생성자가 비밀리에 외부 클래스의 객체에 대한 참조를 취하기 때문에 불가능합니다. newInstance은 인수가없는 생성자가있는 클래스에서만 호출 할 수 있습니다.

+0

감사합니다. 빌더 패턴이나 뭔가 다른 방법이 있습니까? –

+1

외부 인스턴스가없는 내부 클래스를 인스턴스화하는 것이 의미가있는 경우에는 내부 클래스가 아닌 것입니다. – Landei

+0

B는 A 인스턴스에 속합니다. 그것은 단지 obj.as (new B) 대신에'obj.as [B]'와 같은 다른 객체의 메소드 호출로 B를 생성 할 수 있기를 바랍니다. 구문 론적 설탕은 B 생성을 수퍼 클래스로 연기해야합니다. 예상 했겠지만 B는 DCI 컨텍스트의 역할이며 개념적으로 별도의 역할 개체 인 역할 개체 인 역할 개체 인 역할 플레이어의 인상을 원하지 않습니다. 그래서 내가 역할 생성을 "숨기"를 원합니다. –

관련 문제