스칼라의 가변 선언의 일반 와일드 카드
-
20-08-2019 - |
문제
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를 만든 의견에 답하기 위해 항상 공분산이 아니라 항상 변하지 않습니다.
다른 팁
나는 당신의 질문을 전혀 이해하지 못하지만 (아마도 내 커피가 충분하지 않을 것입니다) 당신이 묻는 것처럼 들립니다. 일반 수업. 그렇지 않은 경우 의견을 남기거나 질문에 더 많은 정보를 추가하고 나중에 다시 확인하고 답변을 편집하겠습니다.
제휴하지 않습니다 StackOverflow