복붙노트

[SCALA] 스칼라에서 소거를 입력

SCALA

스칼라에서 소거를 입력

나는 오히려 여기에 무슨 일이 일어나고 있는지에 대해 혼란스러워하고 있습니다 :

import scala.collection.immutable._

object Main extends App {
  sealed trait Node

  sealed trait Group

  case class Sheet(
    val splat: String,
    val charname: String, 
    val children: ListMap[String, Node],
    val params0: ListMap[String, Param], //params0 to separate sheet-general parameters

    val note: Option[Note]
    ) extends Node with Group

  case class Attributes(val name: String) extends Node with Group

  case class Param(val name: String, val value: String) extends Node
  case class Note(val note: String) extends Node

나는 대체 기능의 세 가지 버전이 있어요 - 마지막은 다른 사람이 단지 디버깅 실제로 쓰기에 노력하고있어 하나입니다.

  class SheetUpdater(s: Sheet) {    
    def replace1[T <: Group](g: T): Unit = {
      s.children.head match {
        case (_, _:Sheet) =>
        case (_, _:Attributes) =>
      }
    }
  }

이 버전은 그래서 분명히 내가 런타임에 s.children의 유형에 액세스 할 수있는 어떤 경고가 발생하지 않습니다.

  class SheetUpdater(s: Sheet) {
    def replace2[T <: Group](g: T): Unit = {
      g match {
        case _:Sheet =>
        case _:Attributes =>
      }
    }
  }

나도 그렇게 분명히 g의 유형의 세부 사항은 런타임에 사용할 수 있으며,이 버전을하지 않습니다 ...

  class SheetUpdater(s: Sheet) {
    def replace3[T <: Group](g: T): Unit = {
      s.children.head match {
        case (_, _:T) => //!
        case (_, _:Attributes) =>
      }
    }
  }

...하지만 그렇다고하더라도, 나에게 그것을 삭제 경고에 의해 제거되기 때문에 T 선택하지 지칠대로 지친 추상 형식 패턴을 던지는이 종료된다. 여기 무슨 일이야?

해결법

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

    1.스칼라, 제네릭리스트 [지능] 및리스트 [부울]의 런타임 유형이 실제로 동일하다고하는 수단은, 실행시에 소거된다. 전체 JVM이 제네릭 형식을 지 웁니다 때문이다. 이 모든 JVM이 제네릭이 처음 소개되었을 때 이전 버전과 호환되는 방식으로 다시 유지하고 싶었 기 때문에 예정이다 ...

    스칼라, 제네릭리스트 [지능] 및리스트 [부울]의 런타임 유형이 실제로 동일하다고하는 수단은, 실행시에 소거된다. 전체 JVM이 제네릭 형식을 지 웁니다 때문이다. 이 모든 JVM이 제네릭이 처음 소개되었을 때 이전 버전과 호환되는 방식으로 다시 유지하고 싶었 기 때문에 예정이다 ...

    당신이 사용하는 일반적인 어떤 주위에 스레드 할 수있는 암시 적 매개 변수 인 ClassTag를 사용하여 스칼라에서이 주위에 방법이있다.

    인수로 일반의 유형을 통과으로 ClassTag : 당신은 생각할 수 있습니다. (또한 입력 ClassTag [T]의 암시 파라미터를 전달하는 문법적이다.)

    import scala.reflect.ClassTag
    
    class SheetUpdater(s: Sheet) {
      def replace3[T <: Group : ClassTag](g: T): Unit = {
        s.children.head match {
          case (_, _:T) => //!
          case (_, _:Attributes) =>
        }
      }
    }
    

    이 질문의 최근 답변은 자세한 내용이있다.

  2. from https://stackoverflow.com/questions/38570948/type-erasure-in-scala by cc-by-sa and MIT license