2013-04-14 1 views
3

код, как это:Как получить поле типа [T] на Android в 2.10.1?

import scala.reflect.runtime.{universe => ru, currentMirror => cm} 
import ru._ 

def test[T:TypeTag](obj: T) { 
    for (c <- typeOf[T].declarations; if c.annotations.exists(_.tpe =:= ru.typeOf[Message])) { 
    val tpe = c.asClass.selfType 
    for (m <- tpe.declarations.sorted) { 
     println("Member type: " + m.typeSignature) 
    } 
    } 
} 

object Test extends App { 
    test(TestMessageDef) 
} 

object TestMessageDef { 
    @Message 
    case class A(d: Option[Long]) 
} 

Сообщение определить:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface Message { 
} 

На ПК я могу получить правильный вывод:

Member type: Option[Long] 

но на Android, я получаю выход:

Member type: Option[java.lang.Object] 

Мой вопрос:

  1. Почему такой же код выводит разные результаты на ПК и Android?
  2. Как получить правильный тип, например, ПК?

ОБНОВЛЕНО:

только Опция [T], T является Int, Long, Byte и т.д. примитивного типа имеет эту проблему. Если я использовал Option [java.lang.Long], он выводит как ожидаемый.

ответ

0

Android не на 100% совместим с Java. То, что вы видите, является результатом различий API Java Reflection API или аннотаций, необходимых API API Scala, потерянных при переводе в DalvikVM.