사용 일반적으로 스칼라 커뮤니티에서 좋은 아이디어로 간주되는 것은 무엇입니까?
아니요. Any
은 유형 정보가 없음을 의미하므로 일반적으로 나쁜 습관으로 간주됩니다.
스칼라에서는 사용자가 유니온에서 가능한 많은 유형을 가지고 있다면 성가신 일이지만, 스칼라에서는 Either
을 사용하여 유니온 유형을 나타낼 수 있습니다. 예 :
class MyClass(myField: Either[String, Int]) {
def doSomething = myField match {
case Left(myStringField) => ???
case Right(myIntField) => ???
}
}
또 다른 가능한 방법은 그 형태에 MyClass
제네릭 있도록하는 것입니다 :
class MyClass[A](myField: A)
그러나이 A
의 종류에 어떤 제약 조건을 설정하지 않습니다.
제약 조건을 배치하기 위해. 이 유형의 유한 집합 만들기, 당신은 임시 다형성을 사용할 수 있습니다 범위 암시 MyConstraint[A]
가없는
trait MyConstraint[A]
class MyClass[A: MyConstraint](myField: A)
이제 new MyClass(myValue)
는 컴파일되지 않습니다. 지금 당신은 당신이 암시 값
를 사용하여 허용 할 유형을 허용 목록에 추가 할 수 있습니다
implicit object IntConstraint extends MyConstraint[Int]
implicit object StringConstraint extends MyConstraint[String]
예 :
기술적 인 용어로
new MyClass(42) // ok, there's implicit evidence of MyConstraint[Int]
new MyClass("foo") // ok, there's implicit evidence of MyConstraint[String]
new MyClass(false) // won't compile, no implicit evidence of MyConstraint[Boolean]
, MyConstraint
이 MyClass
의 생성자에서 유형 A
를 수정하는 데 사용되는 유형의 클래스입니다 .
각 인스턴스에 대해 작업 집합을 정의해야하므로 형식 클래스를 더 자세히 특성 지정할 수 있습니다. 예 :
trait MyConstraint[A] {
def mandatoryOp: A
}
implicit object IntConstraint extends MyConstraint[Int] {
def mandatoryOp = 42
}
implicit object StringConstraint extends MyConstraint[String] {
def mandatoryOp = "foo"
}
class MyClass[A](myField: A)(implicit ev: MyConstraint[A]) {
def doSomething: A = ev.mandatoryOp
}
는
A: MyConstraint
유형
MyConstraint[A]
의 암시 적 매개 변수를 필요로하는 단지 문법 설탕입니다 유의하시기 바랍니다. 마지막 예제에서 암시 적 매개 변수
ev
을 범위에서 사용할 수 있도록 명시적인 구문을 선택했습니다.
다형성 클래스를 만들지 마십시오. 'class Foo [T]' –
문제는 필드가 얼마나 많은 다른 타입을 가질 수 있는지 또는 다른 타입이 공통된 특징을 공유하는지에 대한 단서가 없다는 것입니다. – Moebius
'Any'를 사용하는 것은 거의 좋은 생각이 아닙니다. 더 많은 문맥없이 조언을하기는 어렵다. –