lundi 25 avril 2016

Scala bound type parameter and reflection

Could the following Java code:

public <T extends Enum<T>> T foo(Class<T> clazz) {

  return clazz.getEnumConstants()[0];
}

public void bar(Class<?> clazz) {

    if (Enum.class.isAssignableFrom(clazz)) {
        System.out.println(foo(clazz.asSubclass(Enum.class)));
    }
}

bar(MyEnum.class) // will print first value of MyEnum
bar(String.class) // won't print anything

be translated to Scala:

bar[MyEnum]()
bar[String]()

Enum is just an example of a class that follows the T extends Wrapper[T] pattern, and foo could have simply returned the name of the class (or perform any other kind of logic which requires reflective data that is only available in my "Wrapper" class).

I tried to make it work in Scala with TypeTag but failed; I got all sort of compilation errors, such as this: inferred type arguments [?0] do not conform to method foo's type parameter bounds [E <: Enum[E]]





Aucun commentaire:

Enregistrer un commentaire