我有一个方法A,它接受(Consumer〈Map〈String,List〉〉)作为方法参数。
public void myMethodA(Consumer<Map<String,List<String>>> someMap) {
然而,调用方法A的方法B有一个散列表:
Map<String, String> myMap = Collections.singletonMap("a1", Arrays.asList("b"));
如何将变量myMap传递给方法A?
myMethodA((Consumer<Map<String,List<String>>>) myMap);
但我得到的是
java.lang.ClassCastException: java.util.Collections$SingletonMap incompatible with java.util.function.Consumer
1条答案
按热度按时间yvgpqqbh1#
消费者是function1.函数不是Map.函数是..函数--你唯一能做的就是调用函数.具体来说,消费者是一个函数,它接受类型为T的对象,并返回
void
(nothing).因此,
Consumer<Map<String,List<String>>> someMap
是完全错误的,这就像叫你(Tiya)三明治,因为你可以吃三明治,你根本不是三明治,尽管你可以吃三明治。a
和b
之间的唯一区别在于:一个是方法,可以在需要调用方法的上下文中使用,另一个是变量,它们做的是同样的事情,实际上,我可以把
a
方法变成一个函数:这很好用。
因此,没有办法做你想做的,出于同样的原因,它是绝对没有意义这样做:
乔:嘿,我做了个三明治。你能帮我找个会吃三明治的人吗?
蒂娅:当然可以!来,我做了这个三明治。
乔:什么......那是三明治。我想要一个能吃三明治的东西!
1.在java中,对象(比如,表达式有一个"引用类型")或原语(比如,表达式有一个"原语类型")。函数只是引用类型,其类型是所谓的函数接口:一个定义了一个方法的接口。在这一点上,"一个对象,它唯一的外部可调用的东西就是这个精确定义的函数"和"一个函数"变成了几乎相同的东西。当我说"一个消费者是一个函数"时,如果你感到困惑,那么这个脚注解释了这里的全部推理过程。