스칼라에서 제한된 제네릭 클래스를 작성하는 방법

Vumaasha

[V] 대신 Long, Double 형식 만 허용 할 수있는 일반 클래스를 작성해야합니다.

class DummyGenericClass[V](data:Seq[V])

또한 유형에 따라 구현 차이가 있습니다. 나는 뭔가를하고 싶다.

val typ = if (V is Long) "x" else "y"

그러한 코드를 작성하기 위해 스칼라에서 권장 / 모범 사례는 무엇입니까?

아담 비

동일한 파일에 정의 된 구현으로 가능한 구현을 제한하는 봉인 된 특성을 사용하여이를 달성 할 수 있습니다.

sealed trait DummyGenericClass[V] {
  val data: Seq[V]
  val typ: String
}

class LongClass(val data: Seq[Long]) extends DummyGenericClass[Long] {
  val typ = "x"
}

class DoubleClass(val data: Seq[Double]) extends DummyGenericClass[Double] {
  val typ = "y"
}

DummyGenericClass형식이 안전한 방법에 대한 제네릭 생성자를 갖고 싶다면 팩토리 패턴과 결합 된 typeclass를 사용하는 것입니다.

object DummyGenericClass {
  trait Factory[T] {
    def create(seq: Seq[T]): DummyGenericClass[T]
  }

  object Implicits {
    implicit val longProvider = 
      new Factory[Long] {
        def create(seq: Seq[Long]) = new LongClass(seq)
      }

    implicit val doubleProvider =
      new Factory[Double] {
        def create(seq: Seq[Double]) = new DoubleClass(seq)
      }
  }

  def apply[T: Factory](seq: Seq[T]) = implicitly[Factory[T]].create(seq)
}

다음과 같은 방법으로 사용할 수 있습니다.

import DummyGenericClass.Implicits._

val foo = DummyGenericClass(Seq.empty[Long])
val bar = DummyGenericClass(Seq.empty[Double])

// Won't compile:
val baz = DummyGenericClass(Seq.empty[String])

다른 방법 DummyGenericClass은 인스턴스 를 생성하기 위해 타입 클래스를 정의 할 필요가 없으며 , 팩토리 메서드에서 ClassTag바인딩을 전달 T하는 것입니다. 그러나이 솔루션은 지원되지 않고 런타임에 실패 할 유형 인수를 전달할 수 있으므로 유형 안전 방법이 아니므로 권장되지 않습니다.

이 생성자를 사용하는 제네릭 메서드를 원하면 DummyGenericClass.Factory해당 메서드에 바인딩 된 컨텍스트도 추가해야합니다 .

def add[T: DummyGenericClass.Factory]
    (a: DummyGenericClass[T], b: DummyGenericClass[T]) =
  DummyGenericClass(a.data ++ b.data)

import DummyGenericClass.Implicits._

add(DummyGenericClass(Seq(1.0)), DummyGenericClass(Seq(2.0)))

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다debugcn@gmail.com 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

제네릭 클래스를 제네릭으로 확장하는 방법

분류에서Dev

제네릭 형식의 클래스를 반환하는 방법

분류에서Dev

제네릭 클래스에서 Iterable <> 메서드를 구현하는 방법

분류에서Dev

런타임에 제네릭 클래스에 대한 TypeTag를 얻는 방법

분류에서Dev

Kotlin에서 제네릭 클래스를 동일한 클래스의 제네릭 배열에 매핑하는 방법

분류에서Dev

C ++에서 제네릭 기본 클래스를 초기화하는 방법

분류에서Dev

C #에서 제네릭 형식과 클래스를 비교하는 방법

분류에서Dev

제네릭 클래스를 기반으로 제네릭 인터페이스를 정의하는 방법

분류에서Dev

C # 메서드에서 제네릭 클래스 참조를 얻는 방법

분류에서Dev

이니셜 라이저에서 제한된 제네릭에 대한 동적 디스패치를 얻는 방법

분류에서Dev

JAVA의 제네릭 클래스에서 오버라이드 메서드를 사용하는 방법

분류에서Dev

클래스를 제네릭 클래스로 작성하는 경우

분류에서Dev

C #의 제네릭 클래스 내에서 제네릭 클래스의 개체를 사용하는 방법은 무엇입니까?

분류에서Dev

C # 제네릭 형식이 일부 클래스를 구현할 때 클래스를 캐스팅하는 방법

분류에서Dev

제네릭과 Varargs-서브 클래스로 작업하는 방법

분류에서Dev

컬렉션 제네릭 클래스를 확장하는 제네릭 클래스

분류에서Dev

클래스 서명에서 스칼라 제네릭 이해

분류에서Dev

개체를 하위 클래스에 대한 제네릭 형식으로 캐스팅하는 방법?

분류에서Dev

추상 제네릭 클래스에서 파생 된 클래스가 자신을 제네릭 매개 변수로 사용하는지 확인하는 방법

분류에서Dev

Scala에서 Java 제네릭 내부 클래스를 인스턴스화하는 방법은 무엇입니까?

분류에서Dev

typescript에서 제네릭 클래스를 확장하는 생성자와 클래스를 추가하는 방법은 무엇입니까?

분류에서Dev

스위프트에서 수퍼 클래스가 제네릭 클래스 일 때 수퍼 클래스를 상속하는 방법

분류에서Dev

제네릭 유형 객체를 클래스 생성자에 전달하는 방법

분류에서Dev

제네릭 클래스에서 nullable 형식을 처리하는 방법

분류에서Dev

인수 필요 클래스에서 제네릭을 사용하는 방법

분류에서Dev

Django : 쿼리 셋 속성이 클래스 기반 제네릭 뷰에서 작동하는 방식 이해하기

분류에서Dev

Swift에서 제네릭 유형 및 프로토콜로 제한되는 속성으로 클래스를 초기화하는 방법

분류에서Dev

제네릭을 사용하여 다형성 클래스를 디자인하는 방법

분류에서Dev

제네릭 클래스에서 정적 메서드를 사용하는 해결 방법이 있습니까?

Related 관련 기사

  1. 1

    제네릭 클래스를 제네릭으로 확장하는 방법

  2. 2

    제네릭 형식의 클래스를 반환하는 방법

  3. 3

    제네릭 클래스에서 Iterable <> 메서드를 구현하는 방법

  4. 4

    런타임에 제네릭 클래스에 대한 TypeTag를 얻는 방법

  5. 5

    Kotlin에서 제네릭 클래스를 동일한 클래스의 제네릭 배열에 매핑하는 방법

  6. 6

    C ++에서 제네릭 기본 클래스를 초기화하는 방법

  7. 7

    C #에서 제네릭 형식과 클래스를 비교하는 방법

  8. 8

    제네릭 클래스를 기반으로 제네릭 인터페이스를 정의하는 방법

  9. 9

    C # 메서드에서 제네릭 클래스 참조를 얻는 방법

  10. 10

    이니셜 라이저에서 제한된 제네릭에 대한 동적 디스패치를 얻는 방법

  11. 11

    JAVA의 제네릭 클래스에서 오버라이드 메서드를 사용하는 방법

  12. 12

    클래스를 제네릭 클래스로 작성하는 경우

  13. 13

    C #의 제네릭 클래스 내에서 제네릭 클래스의 개체를 사용하는 방법은 무엇입니까?

  14. 14

    C # 제네릭 형식이 일부 클래스를 구현할 때 클래스를 캐스팅하는 방법

  15. 15

    제네릭과 Varargs-서브 클래스로 작업하는 방법

  16. 16

    컬렉션 제네릭 클래스를 확장하는 제네릭 클래스

  17. 17

    클래스 서명에서 스칼라 제네릭 이해

  18. 18

    개체를 하위 클래스에 대한 제네릭 형식으로 캐스팅하는 방법?

  19. 19

    추상 제네릭 클래스에서 파생 된 클래스가 자신을 제네릭 매개 변수로 사용하는지 확인하는 방법

  20. 20

    Scala에서 Java 제네릭 내부 클래스를 인스턴스화하는 방법은 무엇입니까?

  21. 21

    typescript에서 제네릭 클래스를 확장하는 생성자와 클래스를 추가하는 방법은 무엇입니까?

  22. 22

    스위프트에서 수퍼 클래스가 제네릭 클래스 일 때 수퍼 클래스를 상속하는 방법

  23. 23

    제네릭 유형 객체를 클래스 생성자에 전달하는 방법

  24. 24

    제네릭 클래스에서 nullable 형식을 처리하는 방법

  25. 25

    인수 필요 클래스에서 제네릭을 사용하는 방법

  26. 26

    Django : 쿼리 셋 속성이 클래스 기반 제네릭 뷰에서 작동하는 방식 이해하기

  27. 27

    Swift에서 제네릭 유형 및 프로토콜로 제한되는 속성으로 클래스를 초기화하는 방법

  28. 28

    제네릭을 사용하여 다형성 클래스를 디자인하는 방법

  29. 29

    제네릭 클래스에서 정적 메서드를 사용하는 해결 방법이 있습니까?

뜨겁다태그

보관