2013-03-13 4 views
1

면책 조항 : 무엇인지의 문제이다, 실제로 권장 될 수없는 것.구조 유형 매개 변수는

의는 다음과 같은 클래스를 제공하고 있다고 가정 해 봅시다 :

case class point1(x: Int, y:Int) 
case class point2(x: Int, y:Int) 
case class point3(x: Int, y:Int) 

을하고 각 클래스

val points1 = List[point1](/*Can be empty for this example*/) 
val points2 = List[point2]() 
val points3 = List[point3]() 

의 어떤 수를 포함하는 목록이 구조 유형의 목록을 만들 수 있습니다 ++, ::: 또는 .union(..)과 같은 일반적인 기술을 사용하여 모든 클래스가 확장하는 공통적 인 특성을 정의하지 않고 모든 세 가지 유형을 포함 할 수 있습니다 (예 :

).
var points: List[{def x: Int; def y: Int}] = 
    points1 ::: points2 ::: points3 

위의 설명대로 ::: 연산자는 List[Product]을 반환합니다.

var points: ListBuffer[{def x: Int; def y: Int}] = List[{def x: Int; def y: Int}]() 
points1.foreach(e => { 
    val p: {def x: Int; def y: Int} = e; 
    points.append(p); 
}) 
points2.foreach(e => { 
    val p: {def x: Int; def y: Int} = e; 
    points.append(p); 
}) 

어떤 힌트가 있습니까 나는를 선택 스칼라 컴파일러 도움을 줄 수있다 : 나는 다음과 같은 코드가 올바른 유형의 목록을 생성하지 있기 때문에, 스칼라 컴파일러에 대한 권리 힌트를 제공하는 문제입니다 가정 :::에 대해 올바른 유형을 지정하고 구조 유형 목록을 생성합니까?

+0

을 그 메소드를 호출 (또는 속성에 액세스의 비용, 구조 유형이 사용될 때 상당히 똑같습니다. –

+0

@RandallSchulz ** 면책 조항 **에 명시된 바와 같이, 이것은 실제로 코드가 사용되는 것이 아니라 스칼라의 구조 유형 시스템 및 추론을 사용하여 가능한 것으로 생각한 실험입니다. 구조적 타이핑, 특히 암시 적 변환을 결합하면 심각한 성능 영향을 미칠 수 있음을 이해합니다. – Syllepsis

답변

2
(points1 : List[{val x : Int; val y : Int}]) ::: points2 ::: points3 

그것은 작동

var points: List[{def x: Int; def y: Int}] = 
points1 ::: points2 ::: points3 

:

+0

감사합니다. 게시 한 지 몇 분 후에 나는 위에 물어 본 질문과 관련이없는 실제 문제를 발견했습니다. 실제 예제에서,'point3' 클래스는 다른 두 클래스와 정확하게 일치하지 않으며 암시 적 변환에 의존합니다. 암시 적 변환을 시작하는 힌트가 없어서 반환 형식으로'List [Product]'를 사용하여':::'을 (를) 되돌릴 수있었습니다. 고맙습니다! – Syllepsis

0

는 다음과 같은 코드를 작성하려는 경우, 당신은 당신의 대답을 가지고 있지만 인식

implicit def typer[B >: A, A <: { def x: Int; def y: Int }](t: List[B]): List[A] = t 

var points: List[{def x: Int; def y: Int}] = 
points1 ::: points2 ::: points3