2011-08-15 4 views
2

자, 이제 스칼라를 얻으려고합니다. 그러나 지금은 더 까다로운 개념들이 저를 얻습니다. 나 과일 세계에 당신을 소개하자 :일반 콜렉션에서 유형의 서브 세트 선택

class Fruit 
class Pear extends Fruit 
class Apple extends Fruit 
class GrannySmith extends Apple 

이제 내가 나를 일반적인 수집에서 과일의 하위 집합을 선택할 수있는 새로운 일반적인 수집을합니다. 기본 구현 :

class MyArray[T](var a:Array[T]) { 
    def select[U <: T] = 
    a.filter(_ match { 
     case u:U => true 
     case _ => false 
    }) 
} 

이것은 작동하지 않습니다.

<console>:8: warning: abstract type U in type pattern U is unchecked since it is eliminated by erasure 
      case u:U => true 

그래서 형의 삭제에 대한 이해가 매우 모호 :
scala> var ma = new MyArray(
         Array(
          new Apple, 
          new Fruit, 
          new Pear, 
          new GrannySmith, 
          new Apple, 
          new Fruit 
         )) 


scala> ma.select[Apple] 
res1: Array[Fruit] = Array([email protected], [email protected], [email protected], [email protected], [email protected], [email protected]) 

콘솔

는 경우 MyArray 규정이 동안을 준 -unchecked와 다시 실행, 선택하지 않은 오류에 대한 경고했다. Daniel이 here에 대해 말하는 것처럼 Manifests를 사용하여 jvm의 제한된 동적 유형과 관련이 있다는 것을 알고 있습니다. 내가 특히 이해하지 못하는 것은이 예제에서 이것이 어떻게 작동하는지, 그리고 어떻게 주위를 감내 할 수 있는가입니다.

도움에 감사드립니다.

답변

3

어때? 당신은 심지어 올바른 반환 유형을 얻을.

ma.a.collect { case a: Apple => a } 
+0

... 당신이 내 실제 질문을 추가되기 전에 실수로 좋은 작품 – fickludd

+0

) = 게시 말할 수 있습니다 - 감사합니다 잔뜩! 그래도 ma.a.collect를 의미합니까? – fickludd

+0

예, 고쳤습니다. 감사합니다. –

관련 문제