gpt4 book ai didi

java - 有没有办法在 lambda 表达式中显式定义泛型参数类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:36 24 4
gpt4 key购买 nike

我这里有一个 Handler 类,它应该处理特定类型的 Event:

public interface Handler<E extends Event>
{
public void handle(E event);

@SuppressWarnings("unchecked")
public default Class<E> getEventType()
{
for(Method method: this.getClass().getDeclaredMethods())
{
if(method.getName().equals("handle")) return (Class<E>)method.getParameterTypes()[0];
}
throw new NullPointerException("Couldn't find the 'handle' method in this handler.");
}
}

如您所见,默认情况下,每当您执行getEventType()(与显式返回它的 Handler 相对)。这适用于以下 JUnit 测试:

public static class EmptyEvent extends Event
{
public void test() { }
}

public static Handler<EmptyEvent> genericHandler = new Handler<EmptyEvent>()
{
@Override
public void handle(EmptyEvent event)
{

}
};

@Test
public void testEventGenerics()
{
//prints the name of EmptyEvent
System.out.println(genericHandler.getEventType());
}

Intellij IDEA 告诉我可以将 genericHandler 简化为 lambda 表达式,所以我这样做了:

public static class EmptyEvent extends Event
{
public void test() { }
}

public static Handler<EmptyEvent> genericHandler = event -> { };

@Test
public void testEventGenerics()
{
//prints the name of the base Event class
System.out.println(genericHandler.getEventType());
}

但是,测试打印出 Event 的名称,而不是 EmptyEvent

所以我的问题是,有没有办法显式定义 lambda 表达式的泛型参数类型?

我试过做这样的事情,但它没有做任何事情(也是一个错误)

public static Handler<EmptyEvent> genericHandler = (EmptyEvent)event -> { };

最佳答案

是的,您可以定义 lambda 表达式参数的类型:

public static Handler<EmptyEvent> genericHandler = (EmptyEvent event) -> { };

一般来说它不是必需的,因为它是由上下文暗示的。然而,它通常使代码更易于阅读。

参见 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27了解更多详情

关于java - 有没有办法在 lambda 表达式中显式定义泛型参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30363187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com