복붙노트

[SCALA] 어떻게 스칼라에서 일반적인 방법으로 형질의 인스턴스를 만들려면 어떻게해야합니까?

SCALA

어떻게 스칼라에서 일반적인 방법으로 형질의 인스턴스를 만들려면 어떻게해야합니까?

나는이 방법을 사용하여 특성의 인스턴스를 만들려고 해요

val inst = new Object with MyTrait

이것은 잘 작동하지만, 발전기 기능에, 즉이 창조를 이동하고 싶습니다.

object Creator {
  def create[T] : T = new Object with T
}

나는 분명히 어떻게 든 유형의 삭제 문제를 해결하기 위해 매니페스트를 필요 해요,하지만이에 도착하기 전에, 나는이 질문에 대한 실행 :

해결법

  1. ==============================

    1.당신은 (심지어 매니페스트 포함)이 작업을 수행 할 수 없습니다. T와 코드 새로운 객체가 생성 기능이 합격 T.와 객체의 조합을 나타내는 새로운 익명 클래스를 만드는 것을 포함, 당신은 런타임에 (새 바이트 코드 포함)이 새로운 클래스를 생성해야하고, 스칼라에 대한 시설이 없습니다 런타임에 새로운 클래스를 생성.

    당신은 (심지어 매니페스트 포함)이 작업을 수행 할 수 없습니다. T와 코드 새로운 객체가 생성 기능이 합격 T.와 객체의 조합을 나타내는 새로운 익명 클래스를 만드는 것을 포함, 당신은 런타임에 (새 바이트 코드 포함)이 새로운 클래스를 생성해야하고, 스칼라에 대한 시설이 없습니다 런타임에 새로운 클래스를 생성.

    한 가지 전략 대신 클래스의 생성자에 팩토리 메소드의 특별한 기능을 전송하려고하고 직접 생성자를 사용할 수 있습니다.

    또 다른 가능한 전략은이 클래스를 사용하여 관심있는 특성에 변환 함수 (암시 적 또는 기타)를 만드는 것입니다.

  2. ==============================

    2.나는 동기는 질문에 대해 무엇인지 확실하지 않다,하지만 당신은 암시 적 매개 변수로 T의 공장을 통과 고려할 수 있습니다. 이는 유형 클래스 또는 임시 다형성을 사용하는 것으로 알려져있다.

    나는 동기는 질문에 대해 무엇인지 확실하지 않다,하지만 당신은 암시 적 매개 변수로 T의 공장을 통과 고려할 수 있습니다. 이는 유형 클래스 또는 임시 다형성을 사용하는 것으로 알려져있다.

    object Test extends Application {
      trait Factory[T] {
        def apply: T
      }
      object Factory {
        /**
         * Construct a factory for type `T` that creates a new instance by
         * invoking the by-name parameter `t`
         */
        def apply[T](t: => T): Factory[T] = new Factory[T] {
          def apply = t
        }
      }
    
      // define a few traits...
      trait T1
      trait T2
    
      // ...and corresponding instances of the `Factory` type class.
      implicit val T1Factory: Factory[T1] = Factory(new T1{})
      implicit val T2Factory: Factory[T2] = Factory(new T2{})
    
      // Use a context bound to restrict type parameter T
      // by requiring an implicit parameter of type `Factory[T]`
      def create[T: Factory]: T = implicitly[Factory[T]].apply
    
      create[T1]
      create[T2]
    
    }
    

    질문에 대한이 답변에 설명 된대로 스펙트럼의 다른 쪽 끝에서, 당신은, 런타임에 컴파일러를 호출 할 수있다 "스칼라의 동적 믹스 인 -가 가능하다".

  3. from https://stackoverflow.com/questions/3274279/how-do-i-create-an-instance-of-a-trait-in-a-generic-method-in-scala by cc-by-sa and MIT license