如何让Java为我的类型安全地图文字推断出正确的通用地图类型?

Han*_*örr 4 java generics map literals

我试图在java中编写一个类型安全的地图文字辅助类,它可以生成任何类型的地图,并让编译器检查所​​有给定的键和值是否符合地图的类型.对于具有两个值的地图,将有一个具有以下签名的函数:

public static <KEY, VALUE> Map<KEY, VALUE> make(final KEY key1,
        final VALUE value1,
        final KEY key2,
        final VALUE value2)
Run Code Online (Sandbox Code Playgroud)

现在我希望这样的事情是可能的:

    Map<Integer, Object> map = make(1, "bla", 3, 17);
Run Code Online (Sandbox Code Playgroud)

但是我收到编译器错误:

Type mismatch: cannot convert from Map<Integer,Object&Serializable&Comparable<?>> to 
 Map<Integer,Object>
Run Code Online (Sandbox Code Playgroud)

有没有办法来解决这个问题?当然,使用签名定义函数make(Object... keysAndValues)会起作用,但是我会放弃编译时类型安全.:-(

Luk*_*der 6

错误可能在这里:

Map<Integer, Object> map = make(1, "bla", 3, 17);
                                   ^^^^^     ^^
Run Code Online (Sandbox Code Playgroud)

VALUE > Object不能从两个推断StringInteger

尝试以下任何一个:

// Helping the compiler to infer Object for VALUE
Map<Integer, Object> map = make(1, (Object)"bla", 3, 17);

// Explicitly bind VALUE to Object
Map<Integer, Object> map = MyClass.<Integer, Object>make(1, "bla", 3, 17);

// If you don't need to write into "map" (as user pmnt also suggested)
Map<Integer, ?> map = make(1, "bla", 3, 17);
Run Code Online (Sandbox Code Playgroud)