2016-11-16 5 views
0

형식 멤버를 인스턴스화 할 수없는 이유에 대한 간단한 질문은 무엇입니까? 이는 예를 들어 예를 취스칼라 유형 멤버를 인스턴스화하면 오류가 발생합니다.

abstract class SimpleApplicationLoader { 
    type MyComponents <: BuiltInComponentsFromContext 

    def load(context: Context) = { 
    new MyComponents(context).application 
    } 
} 

class SiteServiceApplicationLoader extends SimpleApplicationLoader { 
    type MyComponents = SiteApplicationComponents 
} 

class SiteApplicationComponents(val context: Context) extends BuiltInComponentsFromContext(context) { 
     .... 
} 

SimpleApplicationLoader는 입력 파라미터를 MyComponents 정의 (상부 BuiltinComponentsFromContext결합). 로드 메서드에서 형식 매개 변수 MyComponents이 인스턴스화됩니다. SiteServiceApplicationLoader은 _SiteApplicationComponents에 대한 MyComponents 유형을 대체합니다. 그냥 궁금해서 왜 형 멤버

Error:(13, 9) class type required but SimpleApplicationLoader.this.MyComponents found 
    new MyComponents(context).application 

을 인스턴스화 할 수 없습니다 :

어쨌든, 컴파일러는 다음과 같은 오류를 준다? 해결 방법은 무엇입니까?

감사합니다.

답변

3

교환 원 newclasses (or "like classes")에서만 사용 가능합니다. 유형이 클래스가 아니므로 new을 사용할 수 없습니다.

임의의 유형의 인스턴스를, 함수 그래서 추상 클래스는

abstract class SimpleApplicationLoader { 
    type MyComponents <: BuiltInComponentsFromContext 

    def newMyComponents(context: Context): MyComponents 

    def load(context: Context) = { 
    newMyComponents(context).application  
    } 
} 
모양을

def newMyComponents(context: Context): MyComponents 

업데이트 (덕분에 @ 다니엘 - 베르너)

을 사용할 수

추상 메서드는 class에 구현 될 수 있습니다. type이 정의됩니다.

class SiteServiceApplicationLoader extends SimpleApplicationLoader { 
    type MyComponents = SiteApplicationComponents 
    def newMyComponents(context: Context): MyComponents = 
    new SiteApplicationComponents(context) 
} 
+0

설명 :'SimpleApplicationLoader'에 추상 메소드'newMyComponents' ('MyComponents'를 반환)를 추가 할 것을 제안합니다. 이 메소드는'SiteServiceApplicationLoader'에서 구현 될 것입니다. 이 올바른지? 이 의미는 첫 번째 코드 예제에서 100 % 명확하지 않기 때문입니다. –

3

유형을 인스턴스화 할 수 없습니다. 클래스 만 인스턴스화 할 수 있습니다.

MyComponents을 클래스로 제한하는 코드는 없습니다. 그것도 마찬가지로 형질, 싱글 톤 유형, 복합 유형 또는 인스턴스화 될 수없는 추상 클래스 일 수 있습니다.

다른 언어는 형식을 클래스로 제한하거나 생성자를 제한하는 방법이 있습니다. 예를 들어, C#에서는 형식을 인수가없는 생성자가있는 클래스 또는 구조체로 제한 할 수 있습니다. 하지만 스칼라에는 그러한 제약에 대한 기능이 없습니다.