[SCALA] 추상 유형 / 스칼라 입력 매개 변수
SCALA추상 유형 / 스칼라 입력 매개 변수
내가 좋아하는 뭔가를 할 필요가 일부 스칼라 코드를 작성하는 것을 시도하고있다 :
class Test[Type] {
def main {
SomeFunc classOf[Type]
val testVal: Type = new Type()
}
}
그것은 실패입니다. 나는 분명히 스칼라 일반적인 매개 변수에 대한 뭔가를 이해하지 못하는거야. 분명히, 오해는 C ++에서 문자열 대체와 같은 템플릿 본질적 기능, 그래서 새로운 유형 () 한 기본 생성자가있는 클래스가 전달되는대로 작동하는 것입니다. 그러나, 스칼라, 종류가 다른 종류의 객체입니다.
해결법
-
==============================
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)
from https://stackoverflow.com/questions/818996/abstract-types-type-parameters-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] "스칼라 프로그래밍"에서 일종의 병합은 스택 오버 플로우가 발생합니다 (0) | 2019.11.20 |
---|---|
[SCALA] 스칼라 매크로 : 차이점은 무엇입니까 (일명 타입 체크)이 지정되지 않은 나무 입력 (0) | 2019.11.20 |
[SCALA] 당신은 이름이 문자열에 저장되는 방법을 호출 할 수있는 스칼라 기능이 있습니까? (0) | 2019.11.20 |
[SCALA] 불변의 데이터 구조 파악 (0) | 2019.11.20 |
[SCALA] 왜 하나는 프레임 워크 웹 서버 앞에 HTTP 서버를 사용해야합니까? (0) | 2019.11.20 |