Java 映射函数上的方法引用,当键的类型为String时出现编译错误

Java 映射函数上的方法引用,当键的类型为String时出现编译错误,java,lambda,compiler-errors,hashmap,method-reference,Java,Lambda,Compiler Errors,Hashmap,Method Reference,上下文: 我想在地图上使用函数computeIfAbsent。但是,当我使用 方法引用,键是字符串 当我使用 方法引用,键是一个整数 lambda和键是一个字符串 插图: 以下声明是合法的: Map Map=newhashmap(); 整数键=整数。值为(0); Long值=Long.valueOf(2); map.computeIfAbsent(key,ArrayList::new).add(value);//没有编译错误 以下声明是非法的: Map Map=newhashmap()

上下文

我想在
地图上使用函数
computeIfAbsent
。但是,当我使用

  • 方法引用,键是
    字符串
当我使用

  • 方法引用,键是一个
    整数
  • lambda和键是一个
    字符串
插图

以下声明是合法的:

Map Map=newhashmap();
整数键=整数。值为(0);
Long值=Long.valueOf(2);
map.computeIfAbsent(key,ArrayList::new).add(value);//没有编译错误
以下声明是非法的:

Map Map=newhashmap();
String key=“myKey”;
Long值=Long.valueOf(2);
map.computeIfAbsent(key,ArrayList::new).add(value);//编译错误:类型ArrayList未定义此处适用的ArrayList(字符串)
以下声明是合法的:

Map Map=newhashmap();
String key=“myKey”;
Long值=Long.valueOf(2);
map.computeIfAbsent(key,x->newArrayList()).add(value);//没有编译错误
问题
我不明白为什么一个
字符串
作为键在与方法引用结合时那么特殊。有什么想法吗?

当你调用
ArrayList::new
而不是
x->new ArrayList()
它等于调用
x->new ArrayList(x)

方法
computeIfAbsent
需要一个lambda参数作为第二个输入参数的lambda表达式,或者对使用一个
String
类型参数的方法的引用

你的错误

编译错误:类型ArrayList未定义此处适用的ArrayList(字符串)

正在讲话:
您试图用一个字符串参数调用构造函数
。因为,正如我上面所说,lambda
x->someObject.method(x)
等于
someObject::method
。或者lambda
x->newsomeclass(x)
等于
SomeClass::new


这里不能使用方法(构造函数)引用,因为这里需要使用一个参数或lambda表达式的方法(构造函数)。如果存在没有任何参数的lambda,则可以调用空构造函数。

您的回答给了我需要的提示:在ArrayList类中,只有以下构造函数:ArrayList(),ArrayList(Collection@KeyMaker00嗯……我告诉过你,你使用的方法引用并不需要:)我试图解释错误是什么。如果答案令你满意,请将其标记为正确。德国劳埃德船级社:)
Map<Integer, List<Long>> map = new HashMap<>();
Integer key = Integer.valueOf(0);
Long value = Long.valueOf(2);
map.computeIfAbsent(key, ArrayList::new).add(value); // No compilation error
Map<String, List<Long>> map = new HashMap<>();
String key = "myKey";
Long value = Long.valueOf(2);
map.computeIfAbsent(key, ArrayList::new).add(value); // Compilation error: The type ArrayList does not define ArrayList(String) that is applicable here
Map<String, List<Long>> map = new HashMap<>();
String key = "myKey";
Long value = Long.valueOf(2);
map.computeIfAbsent(key, x -> new ArrayList<>()).add(value); // No compilation error