복붙노트

[SCALA] 추상 유형 / 스칼라 입력 매개 변수

SCALA

추상 유형 / 스칼라 입력 매개 변수

내가 좋아하는 뭔가를 할 필요가 일부 스칼라 코드를 작성하는 것을 시도하고있다 :

class Test[Type] { 
   def main {
       SomeFunc classOf[Type]
       val testVal: Type = new Type()
    }
 }

그것은 실패입니다. 나는 분명히 스칼라 일반적인 매개 변수에 대한 뭔가를 이해하지 못하는거야. 분명히, 오해는 C ++에서 문자열 대체와 같은 템플릿 본질적 기능, 그래서 새로운 유형 () 한 기본 생성자가있는 클래스가 전달되는대로 작동하는 것입니다. 그러나, 스칼라, 종류가 다른 종류의 객체입니다.

해결법

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

    1.당신이 지적으로, C ++ 템플릿이 있습니다. 즉, C ++는 "모든 종류의 T 그러한 테스트 컴파일에 대한 테스트가있다."라고 즉 암묵적으로 T에 제약 조건을 추가 할 수 있지만 아래쪽 측면들이있는 거 암시와 클래스의 사용자가 코드를 읽지 않고 이해하기 어려울 수 있습니다에 쉽게이를 수 있습니다.

    당신이 지적으로, C ++ 템플릿이 있습니다. 즉, C ++는 "모든 종류의 T 그러한 테스트 컴파일에 대한 테스트가있다."라고 즉 암묵적으로 T에 제약 조건을 추가 할 수 있지만 아래쪽 측면들이있는 거 암시와 클래스의 사용자가 코드를 읽지 않고 이해하기 어려울 수 있습니다에 쉽게이를 수 있습니다.

    훨씬 더 ML, 하스켈, 자바 및 C #과 같은 스칼라의 파라 메트릭 다형성 (제네릭 일명) 작동합니다. 당신이 "클래스는 테스트 [T]는"당신은 제약없이 "유형 테스트 [T]가 존재하는 모든 T에 대해"말을 쓰기 스칼라합니다. 즉 공식적 대한 이유를 간단하게, 그러나 당신이 제약 조건에 대한 명시 될 필요가 있음을 의미한다. 예를 들어, 스칼라 당신은 말할 수있다 "클래스 테스트 [T <: 푸]"T는 푸의 하위 유형이어야한다는 말을.

    C #은 생성자에 대한 T에 제약 조건을 추가하는 방법이 있지만, 불행히도 스칼라하지 않습니다.

    스칼라에서 문제를 해결하는 방법이 몇 가지 있습니다. 하나는 형태 보증 그러나 더 자세한 BT는 것입니다. 다른 하나는 형태 보증하지 않습니다.

    보증 된 방법의 모습처럼

    class Test[T](implicit val factory : () => T) {
      val testVal = factory
    }
    

    그런 다음 당신은 당신의 시스템에 유용 유형 공장의 몸을 가질 수있다

    object Factories {
      implicit def listfact[X]() = List[X]()
      implicit def setfact[X]() = Set[X]()
      // etc
    }
    
    import Factories._
    val t = new Test[Set[String]]
    

    라이브러리 필요 사용자는 자신의 공장은 그들은 공장 객체의 자신의 동등한를 추가 할 수 있습니다. 이 솔루션의 장점 중 하나는 인수 없음의 생성자 거기 여부, 공장과 그 아무것도 사용할 수 있습니다.

    그리 형태 보증 된 방법으로 사용하는 반사와 스칼라의 기능은 자바 제약에 대한 형의 삭제를 주위에 얻을 수있는 방법이다 매니페스트라고

     class Test[T](implicit m : Manifest[T]) {
       val testVal = m.erasure.newInstance().asInstanceOf[T]
     }
    

    당신은 여전히 ​​쓰기이 버전으로

    class Foo
    val t = new Test[Foo]
    

    아무 인수 없음의 생성자을 사용할 수있을 경우, 당신은 정적 유형 오류 대신 런타임 예외가

    scala> new Test[Set[String]] 
    java.lang.InstantiationException: scala.collection.immutable.Set
    at java.lang.Class.newInstance0(Class.java:340)
    
  2. from https://stackoverflow.com/questions/818996/abstract-types-type-parameters-in-scala by cc-by-sa and MIT license