문제

Java에서는 이것을 할 수 있습니다.

class MyClass {
    private List<? extends MyInterface> list;

    public void setList(List<MyImpl> l) { list = l; }
}

... 그것을 가정합니다 (MyImpl implements MyInterface) 물론이야.

이것에 대한 아날로그는 무엇입니까? 스칼라, a Buffer?

import java.lang.reflect._
import scala.collection.mutable._

class ScalaClass {
   val list:Buffer[MyInterface]  = null

   def setList(l: Buffer[MyImpl]) = {
     list = l
   }
}

물론 이것은 컴파일하지 않지만 어떻게 선언합니까? list 그런 방식으로 변수?

편집하다; 조금 더 추가하고 있습니다. 차이점은 분명히 Java에서 제네릭이 t, 스칼라에서는 공분산이 될 수 있습니다. 예를 들어 Scala 클래스 List t에서 공분산입니다 (그리고 반드시 불변). 따라서 다음 컴파일됩니다:

class ScalaClass {
   val list:List[MyInterface]  = null

   def setList(l: List[MyImpl]) = {
     list = l
   }
}

나는 여전히 컴파일러 오류로 약간 어려움을 겪고 있습니다.

Covariant type T occurs in contravariant position in ...

예를 들어; 이 컴파일러 오류는 클래스 선언에서 발생합니다.

class Wibble[+T] {
  var some: T = _ //COMPILER ERROR HERE!
 }

별도의 질문을하겠습니다 ...

도움이 되었습니까?

해결책

직접 아날로그

import java.util.List;
List<? extends MyInterface> list;

~이다

import java.util.List
var list : List[_ <: MyInterface]  = _;

버퍼와 동일합니다

Java 유형 매개 변수에서 Earler를 만든 의견에 답하기 위해 항상 공분산이 아니라 항상 변하지 않습니다.

다른 팁

나는 당신의 질문을 전혀 이해하지 못하지만 (아마도 내 커피가 충분하지 않을 것입니다) 당신이 묻는 것처럼 들립니다. 일반 수업. 그렇지 않은 경우 의견을 남기거나 질문에 더 많은 정보를 추가하고 나중에 다시 확인하고 답변을 편집하겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top