Java 8通用函数映射

Chr*_*rno 6 java generics java-8

不确定这是否可能; 我承认我并不像我希望的那样擅长仿制药.

基本上,我想创建一个类 - >函数的映射,其中用于键的类是函数输入的类,就像这样(不合法的语法):

public static Map<Class<T>,Function<T,Expression>> STUFF = new HashMap<>();

{
    STUFF.put(List.class, ListExpression::new);
    STUFF.put(String.class, StringExpression::new);// this constructor must take string
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

Function<String,Expression> e = STUFF.get(o.getClass());
Expression ex = e.apply(o);
Run Code Online (Sandbox Code Playgroud)

它适合我的类型.

Raf*_*ele 6

它无法完成.每次你想要的时候Map<Class<T>, SomeType<T>>,即将一个类与参数化类型相关联,以某种方式与键中的类相关,就无法完成.这是因为密钥类型Class<T>必须按照Map<K, V>定义在所有条目之间共享.

剩下的是Map<Class<?>, SomeType<?>>在私有字段中封装此映射并在将项放入映射时检查约束的实际替代方法.就像是

public class StuffManager {

  private final Map<Class<?>, Consumer<?>> stuff = new HashMap<>();

  public <T> void register(Class<T> key, Consumer<? super T> val) {
    stuff.put(key, val);
  }
}
Run Code Online (Sandbox Code Playgroud)