trait InnerTrait
                  
                  
                  case class InnerFirst() extends InnerTrait
                  
                  
                  case class InnerSecond() extends InnerTrait
                  
                  
                  
                  
                  
                  sealed trait OuterTrait
                  
                  
                  case class OuterFirst() extends OuterTrait
                  
                  
                  case class OuterSecond() extends OuterTrait
                  
                  
                  
                  
                  
                  object OuterTrait {
                  
                  
                    def create[F <: InnerTrait](): OuterTrait =
                  
                  
                      ??? match {
                  
                  
                        case InnerFirst()  => OuterFirst()
                  
                  
                        case InnerSecond() => OuterSecond()
                  
                  
                      }
                  
                  
                  }
                  
                  
                  чтоб потом в create подсунул в качестве типа нужный наследник InnerTrait и тебе инстанцировал нужного наследника OuterTrait.
                  
                  
                  Например
                  
                  
                  val v1: OuterTrait = OuterTrait.create[InnerFirst]()
                  
                  
                  val v2: OuterTrait = OuterTrait.create[InnerSecond]()
                  
                  
                  и в v1 и v2 соответственно OuterFirst и OuterSecond
                  
                  
                
через тайпклассы?
Обсуждают сегодня