【发布时间】:2015-08-23 14:45:26
【问题描述】:
在 java 中,您可以将类型参数添加到静态方法,以创建处理泛型的方法。你可以对 lambdas 做同样的事情吗?
在我的代码中我有
final private static <K,V> Supplier<Map<K, List<V>> supplier=HashMap::new;
我正在尝试将类型参数当作函数,但它不会让我这样做。
如果我这样做:
final private static Supplier<Map<?, List<?>>> supplier=HashMap::new;
它不接受我尝试使用它的论点。我能做什么?
【问题讨论】:
-
这不能是一个变量。事实上,像
WhateverClassThatSupportsGenerics<?> var = ...;这样声明一个变量是没有用的,除非它是一个方法的参数。 -
你在哪里尝试使用第二个声明? (您可能已经发现,第一个在语法上是无效的。)
-
不可能构造有界的通用对象。您的代码行失败的原因相同,
new HashMap<Integer, List<?>>是合法的,但new HashMap<?, List<?>>不是。?的意思是“我不知道这个 HashMap 使用什么类型”,但是当你创建一个 HashMap 时,你总是知道你打算在其中放入什么(即使你决定它是 java.lang.Object)。 -
@VGR:感谢“钻石运算符”,该规则已过时。你可以说
HashMap<?, ?> map=new HashMap<>();而不指定实际的类型参数。虽然这样的地图用处不大…… -
@Holger 有趣。我不知道这是可能的。我一直认为菱形运算符只是一种方便,节省了一些打字时间。
标签: java generics lambda java-8