2012-06-10 2 views
1

그는 다음 컴파일 입력 경로 의존의 형태 지정 :스칼라 : 영사에게

import scala.collection.mutable.MutableList 

abstract class GeomBase[T <: DTypes] 
{ 
    val grids = new MutableList[GridBase] 

    def hexs: MutableList[GridBase#HexG with T#HexTr] = grids.flatMap(_.hexs.toList) 
    //the above compiles fine 

    abstract class GridBase 
    { 
    val hexs: MutableList[HexG with T#HexTr] = new MutableList[HexG with T#HexTr] 


    class HexG(coodI: Cood) extends Hex 
    { 
    } 
    } 
} 

그러나이 나는이이

def hexs: MutableList[GridBase#HexG with T#HexTr] = grids.flatMap (_.hexs.toList) 

에서 선 (목록에 MutableList 변경)을 변경하면

def hexs: List[GridBase#HexG with T#HexTr] = grids.flatMap (_.hexs.toList) 

더 이상 컴파일되지 않습니다. 이것은 내가 전자의 경우에 MutableList이 필요하고, 후자의 호환성을 입력 말, 하나

def hexs: MutableList[GridBase#HexG with T#HexTr] = grids(0).hexs 

그것은 늘 컴파일 컴파일되지 않습니다. 나는 왜 그런지 이해하지 못한다. 혼란을 야기하는 경우에 대비하여 HexG는 자체적으로 GeomBase의 내부 클래스 인 GridBase의 내부 클래스입니다.

업데이트 : Travis Brown의 대답은 첫 번째 오류에 대한 올바른 설명을 제공하는 것으로 보입니다. MutableList의 모든 사용을 List로 변경했습니다. 놀랍게도 이것은 첫 번째 오류뿐만 아니라 두 번째 오류도 막을 수있었습니다. 가장 바깥 쪽의 GeomBase 클래스 외부에서 유형을 사용하려고 할 때도 오류가 발생합니다. 나는 컴파일러 충돌이있다. 유형을 인스턴스화 할 때. MutableLists에서 목록으로 변경하면 예기치 않게 이러한 오류 중 하나가 제거되지만 컴파일러 충돌은 제거되지 않습니다. 나는 2.10.0-M3 용 스칼라 Eclipse 플러그인 2.1 스페셜 에디션을 사용 해왔다. 이것은 스칼라 컴파일러와 경로 의존형에 여전히 문제가있을 수 있다는 결론에 이릅니다.

답변

2

여기 (아마) 문제는 경로 종속 형식과 관련이 없습니다. 다음 고려 :

val xs: MutableList[Seq[Int]] = new MutableList ++ Seq(1 to 2, 3 to 4) 

지금 우리가 할 수를 예를 들어, 다음

scala> xs.flatMap(_.toList): List[Int] 
<console>:10: error: type mismatch; 
found : scala.collection.mutable.MutableList[Int] 
required: List[Int] 
       xs.flatMap(_.toList): List[Int] 

우리가 그것을라고했다면 :

scala> xs.flatMap(_.toList) 
res0: scala.collection.mutable.MutableList[Int] = MutableList(1, 2, 3, 4) 

그러나 MutableList이 아닌 List입니다 예를 들어 Seq[Int] 일 수 있습니다. SeqMutableList의 수퍼 유형이기 때문에 괜찮습니다. List은 (이름에도 불구하고) 없습니다.

grids(0).hexs에 올바른 유형이 없기 때문에 오류가 발생합니다. MutableList[GridBase#HexG with T#HexTr]이 아닙니다. 당신이 그 코드를 우리와 공유하지 않았기 때문에 그것이 무엇인지 모르겠습니다. 각주로


:
xs.flatMap(_.toList)(collection.breakOut): List[Int] 

는하지만,이 작업을 수행하지 마십시오 흥미롭게도 (또는 아마), 다음 작업을 수행합니다. breakOutweird magic입니다.

+0

격자 (0) .hexs는 반드시 grid (0) .HexG이고 T # hexTr 유형이며 투영 된 유형의 인스턴스는 아닙니다. 관련 코드가 숨겨져 있지 않습니다. 그리드를 실제로 인스턴스화하기 전에 일치시킬 유형을 얻으려고 할 때 실제로 그리드가 비어 있습니다. 그리드 (grid)를 사용하는 것이 전체 컬렉션을 사용하는 것과 어떻게 다른지 나는 알 수 없다. –

+0

'grids (0)'은 T # HexTr을 가진'GridBase # HexG '가 될 것이지만, 무엇이든의'MutableList '는 아닙니다. –

+0

그리드 (0)는 반드시 GridBase의 인스턴스가 될 것입니까? –