Java 具有函数值的不可修改映射无法编译

Java 具有函数值的不可修改映射无法编译,java,function,collections,unmodifiable,Java,Function,Collections,Unmodifiable,我有一份推荐信: public final static LinkedHashMap<String, Function<OrderBean, String>> DELEGATES; 我喜欢: static { LinkedHashMap<String, Function<OrderBean, String>> tmp = new LinkedHashMap<>(); tmp.put(OrderCols.FIELD1,

我有一份推荐信:

public final static LinkedHashMap<String, Function<OrderBean, String>> DELEGATES;
我喜欢:

static {
    LinkedHashMap<String, Function<OrderBean, String>> tmp = new LinkedHashMap<>();
    tmp.put(OrderCols.FIELD1, OrderBean::getFIELD1);
    tmp.put(OrderCols.FIELD2, OrderBean::getFIELD2);
    ...        
    DELEGATES = Collections.unmodifiableMap(tmp);
}
在静态块的最后一行(分配给代理),我得到了以下编译器错误:

错误:64,48 java:不兼容的类型:不存在类型变量K,V的实例,因此java.util.Map符合java.util.LinkedHashMap>


我把事情搞砸了吗?或者不可修改的视图不喜欢函数类型吗?

不,您的问题是它而不是

public final static LinkedHashMap<String, Function<OrderBean, String>> DELEGATES;
你应该

public final static Map<String, Function<OrderBean, String>> DELEGATES;

…因为unmodifiableMap返回一个裸映射实现。不过,支持的数据结构仍将是LinkedHashMap。

不,您的问题是它而不是

public final static LinkedHashMap<String, Function<OrderBean, String>> DELEGATES;
你应该

public final static Map<String, Function<OrderBean, String>> DELEGATES;

…因为unmodifiableMap返回一个裸映射实现。不过,支持的数据结构仍将是LinkedHashMap。

这相当快,我想强制外部结构成为LinkedHashMap。我可以直接投吗?编译器似乎很好。@DiegoMartinoia:不,你不能那样做;它将在运行时与ClassCastException中断。你必须这样做。路易斯是燃烧的速度和点,铸造和双铸造抛出异常@Louis,有没有办法把委托编译成linkedhashmap?否则我很乐意避免这种情况:当我说你必须这样做时,我的意思是你必须这样做。不,你不能让它成为LinkedHashMap。那太快了,我想强制外部的一个成为LinkedHashMap。我可以直接投吗?编译器似乎很好。@DiegoMartinoia:不,你不能那样做;它将在运行时与ClassCastException中断。你必须这样做。路易斯是燃烧的速度和点,铸造和双铸造抛出异常@Louis,有没有办法把委托编译成linkedhashmap?否则我很乐意避免这种情况:当我说你必须这样做时,我的意思是你必须这样做。不,你不能让它成为LinkedHashMap。