【发布时间】:2018-01-31 03:33:21
【问题描述】:
我有一个方法看起来像这样。
public <E extends Enum<E> & Some> void setOther(final E some) {
setOther(ofNullable(some).map(e -> e.name()).orElse(null);
}
现在 IntelliJ 建议对 e -> e.name() 部分使用方法引用。
我改变了它。
public <E extends Enum<E> & Some> void setOther(final E some) {
setOther(ofNullable(some).map(Enum::name).orElse(null);
}
现在编译器会抱怨它。
... ....java:nnn: warning: [rawtypes] found raw type: Enum
setOther(ofNullable(some).map(Enum::name).orElse(null));
^
输入@SuppressWarnings({"uncheked"}) 不起作用。
我怎样才能消除它?我应该坚持e -> e.name()吗?
【问题讨论】:
-
您使用的是什么编译器和版本?并请包括确切的警告。也许它甚至不是来自编译器,而是来自您安装的另一个源代码检查工具。 1.8.0_131 的 Javac 和 Eclipse 4.7.2RC2 的 Java 编译器都会为您的代码生成任何警告。 (它们最初确实会显示错误,因为您在前两个代码 sn-ps 中缺少右括号
)。) -
应该是
Some::name吧? -
无论如何,如果警告是针对
[rawtypes],你应该使用@SuppressWarnings("rawtypes") -
Optional不是 if/else 的一般替代品。你可以把这个方法写成setOther(some != null ? some.name() : null);,在我看来这更易读。它将完全消除泛型问题。 -
虽然可以使用
E::name解决它,但我认为警告是编译器错误。另请参阅this answer。
标签: java lambda method-reference