在Java中创建通用lambda

在Java中创建通用lambda,java,generics,lambda,java-8,Java,Generics,Lambda,Java 8,在java中,您可以向静态方法添加类型参数,以创建处理泛型的方法。你能用兰博达斯做同样的事吗 在我的代码中,我有 final private static <K,V> Supplier<Map<K, List<V>> supplier=HashMap::new; final private static Supplier解决方法之一是将方法引用包装到方法中,以便目标类型推断在调用站点解析类型: import java.util.HashMap; imp

在java中,您可以向静态方法添加类型参数,以创建处理泛型的方法。你能用兰博达斯做同样的事吗

在我的代码中,我有

final private static <K,V> Supplier<Map<K, List<V>> supplier=HashMap::new;

final private static Supplier解决方法之一是将方法引用包装到方法中,以便目标类型推断在调用站点解析类型:

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

public class GenericLambda
{
    // Syntactically invalid
    //final private static <K,V> Supplier<Map<K, List<V>> supplier=HashMap::new;

    final private static Supplier<Map<?, List<?>>> supplier=HashMap::new;

    // A workaround
    private static <K,V> Supplier<Map<K, List<V>>> supplier()
    {
        return HashMap::new;
    }


    public static void main(String[] args)
    {
        // Does not work
        //useSupplier(supplier);

        // Works
        useSupplier(supplier());
    }

    private static <K, V> void useSupplier(Supplier<Map<K, List<V>>> s)
    {
        System.out.println(s.get());
    }
}
import java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入java.util.function.Supplier;
公共类泛型lambda
{
//语法无效

//不能是变量的最终私有静态提供者。事实上,声明一个变量(如
WhateverClassThatSupportsGenerics var=…;
)是没有用的,除非它是一个方法的参数。您尝试在哪里使用第二个声明?(第一个,正如您可能发现的,在语法上是无效的。)无法构造有界泛型对象。您的代码行失败的原因与
新HashMap>
失败的原因相同。
的意思是“我不知道这个HashMap使用什么类型”,但当您创建HashMap时,您总是知道要在其中放入什么(即使您确定它是java.lang.object)。@VGR:感谢“菱形运算符”,该规则已过时。您可以说
HashMap map=newhashmap();
不指定实际的类型参数。虽然这样的映射没有多大用处…@Holger很有趣。我不知道这是可能的。我一直认为菱形运算符只是一种方便,节省了一点输入。@nodata不确定您的意思,但在这里,不需要强制转换(虽然在这种情况下,强制转换也可能是安全的,因为所有类型参数在编译时都会变成
Object
)。不过编写
supplier()并没有多大好处
作为方法参数,而不是直接在该位置写入
HashMap::new
,这意味着所有调用站点都同意这样的实现类切换是可以接受的,甚至是有意的。否则,您必须遍历所有位置并验证此假设。同时ashMap::new
to
LinkedHashMap::new
从纯面向对象的角度来看,一个单一的方法听起来像是一个巨大的优势,在这个世界上,我们并没有像样的搜索和替换工具,它不仅可以替换所有出现的
HashMap::new
to
LinkedHashMap::new
,而且还可以显示允许程序员使用的每个地方霍尔格:我不知道你在问什么:所有这些都被称为工厂方法模式。根据利什科夫的说法,任何使用
HashMap
的方法都可以使用
LinkedHashMap
。然而,我只是想勾画一个解决方案,以实现OP所描述的目标。必须有一个原因关于为什么不是每个人都一直在使用
LinkedHashMap
而不是
HashMap
,尽管如此,你只是想勾画一个解决方案来实现OP描述的目标,假设这就是OP想要的,因为我无法从问题中推断他为什么尝试他尝试的东西,我只想提到这一点我看不到在工厂方法(尤其是
private
one)中包装像
HashMap::new
这样简单的表达式有什么真正的好处。工厂方法没有特定的用途。但也许OP会回来告诉我们更多关于它的信息…
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

public class GenericLambda
{
    // Syntactically invalid
    //final private static <K,V> Supplier<Map<K, List<V>> supplier=HashMap::new;

    final private static Supplier<Map<?, List<?>>> supplier=HashMap::new;

    // A workaround
    private static <K,V> Supplier<Map<K, List<V>>> supplier()
    {
        return HashMap::new;
    }


    public static void main(String[] args)
    {
        // Does not work
        //useSupplier(supplier);

        // Works
        useSupplier(supplier());
    }

    private static <K, V> void useSupplier(Supplier<Map<K, List<V>>> s)
    {
        System.out.println(s.get());
    }
}