0

たとえば、次のものがあるとします。

object Types {
   type ObjectMap = collection.Map[String, Any]
}

class X {
  def toObjectMap(x:Any): ObjectMap = x.asInstanceOf[Types.ObjectMap] 
}

これには、次のものと比較して、追加のランタイムペナルティがありますか?

class X {
  def toObjectMap(x:Any): collection.Map[String, Any]= x.asInstanceOf[collection.Map[String, Any]] 
}
4

2 に答える 2

4

期待はしていませんが、試してみるのはとても簡単です。

scala> :javap -prv X

  public scala.collection.Map<java.lang.String, java.lang.Object> toObjectMap(java.lang.Object);
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=2, args_size=2
         0: aload_1       
         1: checkcast     #9                  // class scala/collection/Map
         4: areturn       
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       5     0  this   L$line9/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$X;
               0       5     1     x   Ljava/lang/Object;
      LineNumberTable:
        line 53: 0
    Signature: #75                          // (Ljava/lang/Object;)Lscala/collection/Map<Ljava/lang/String;Ljava/lang/Object;>;

  public scala.collection.Map<java.lang.String, java.lang.Object> toObjectMap2(java.lang.Object);
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=2, args_size=2
         0: aload_1       
         1: checkcast     #9                  // class scala/collection/Map
         4: areturn       
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       5     0  this   L$line9/$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$X;
               0       5     1     x   Ljava/lang/Object;
      LineNumberTable:
        line 54: 0
    Signature: #75                          // (Ljava/lang/Object;)Lscala/collection/Map<Ljava/lang/String;Ljava/lang/Object;>;
于 2013-10-24T00:38:46.853 に答える
0

型エイリアスは単なる省略形です。コンパイラはエイリアスを展開し、それ以降は、あたかも自分で型を記述したかのように正確に処理を進めます。(少なくともあなたの特定の例では、ソムの答えが示すように。)

于 2013-10-24T01:22:50.870 に答える