- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的代码包含对 Enum::name
的引用(注意没有类型参数)。
public static <T extends Enum<T>> ColumnType<T, String> enumColumn(Class<T> klazz) {
return simpleColumn((row, label) -> valueOf(klazz, row.getString(label)), Enum::name);
}
public static <T, R> ColumnType<T, R> simpleColumn(BiFunction<JsonObject, String, T> readFromJson,
Function<T, R> writeToDb) {
// ...
}
[WARNING] found raw type: java.lang.Enum missing type arguments for generic class java.lang.Enum
Enum<T>::name
导致警告消失。
Enum<T>::name
带有警告的版本:
Explicit type arguments can be inferred
Enum<Clause>::name
会导致编译失败,所以这是一些额外的保护。
e -> e.name()
lambda,并且这个公式不需要类型参数。
最佳答案
没有“原始方法引用”这样的东西。虽然原始类型的存在是为了帮助迁移 pre-Generics 代码,但不能有任何 pre-Generics 使用方法引用,因此没有“兼容模式”,类型推断是常态。 Java Language Specification §15.13. Method Reference Expressions状态:
If a method or constructor is generic, the appropriate type arguments may either be inferred or provided explicitly. Similarly, the type arguments of a generic type mentioned by the method reference expression may be provided explicitly or inferred.
Method reference expressions are always poly expressions
::
之前调用类型一个“原始类型”当它引用一个泛型类而不指定类型参数时,编译器仍然会根据目标函数类型推断泛型类型签名。这就是为什么在此处生成有关“原始类型使用”的警告没有意义的原因。
BiFunction<List<String>,Integer,String> f1 = List::get;
Function<Enum<Thread.State>,String> f2 = Enum::name;
可以用
javac
编译没有任何警告(规范命名了应该推断类型的类似示例),而
Function<Thread.State,String> f3 = Enum::name;
生成警告。
specification says关于这个案例:
In the second search, if
P1
, ...,Pn
is not empty andP1
is a subtype of ReferenceType, then the method reference expression is treated as if it were a method invocation expression with argument expressions of typesP2
, ...,Pn
. If ReferenceType is a raw type, and there exists a parameterization of this type,G<...>
, that is a supertype ofP1
, the type to search is the result of capture conversion (§5.1.10) applied toG<...>
;…
Enum<Thread.State>
作为
Enum
的参数化那是
Thread.State
的父类(super class)型搜索适当的方法并得到与
f2
相同的结果例子。它以某种方式确实有效,但它会生成无意义的原始类型警告。
javac
只有在必须搜索适当的父类(super class)型时才会生成此警告,对于您的情况,有一个简单的解决方案。只需使用确切类型进行搜索:
public static <T extends Enum<T>> ColumnType<T, String> enumColumn(Class<T> klazz) {
return simpleColumn((row, label) -> valueOf(klazz, row.getString(label)), T::name);
}
这将在没有任何警告的情况下编译。
关于java-8 - 对原始类型的方法引用有害吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37185734/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我在摆弄 LinqToSQL 和 LINQPad,我注意到 SingleOrDefault() 没有对生成的 SQL 进行任何过滤或限制(我几乎期望与 Take(1) 等效)。 因此,假设您想保护自己
我是一名优秀的程序员,十分优秀!