无法编译以下内容:
@NotNull String defaultFormatter(@Nullable Object value) {
if (value instanceof Collection) {
return ((Collection) value).stream()
.map(MyClass::defaultFormatter)
.collect(Collectors.joining(eol));
}
return String.valueOf(value);
}
特别是,使用javac编译时,错误将是:
Error:(809, 94) java: incompatible types:
java.lang.Object cannot be converted to
@org.jetbrains.annotations.NotNull java.lang.String
但下面的汇编很好:
@NotNull String defaultFormatter(@Nullable Object value) {
if (value instanceof Collection) {
Stream<String> stream = ((Collection) value).stream()
.map(MyClass::defaultFormatter);
return stream.collect(Collectors.joining(eol));
}
return String.valueOf(value);
}
唯一的区别是我引入了一个额外的变量。请注意,我没有施法,所以没有语义变化。
有人能解释为什么需要这样做吗?
这个答案的顶部基本上就是Radiodef在上面的评论中所说的。我不想盗用这些词,但是如果没有事先的解释,--
下面的答案就不起作用了。
正如Radiodef所指出的,这在第一种情况下不起作用的原因是,它使用了原始类型,Collection
。相反,使用集合
return ((Collection<?>) value).stream()
.map(MyClass::defaultFormatter)
.collect(Collectors.joining(eol));
它与显式变量一起工作的原因是未经检查的转换。请注意,以下内容会产生未经检查的转换警告:
Stream<String> stream = ((Collection) value).stream()
.map(MyClass::defaultFormatter);
RHS上表达式的实际类型是
Stream
;您可以将其强制到Stream
有一个未经检查的转换,从原始类或接口类型(§4.8)
G
到表单G的任何参数化类型
没有变量就不能这样做的原因有点微妙。这个答案更直接地解决了这个问题:当您使用原始类型时,所有泛型都会从类型中删除,而不仅仅是与省略类型直接相关的泛型。
所以,
流的类型。当
流为原始时,collect
是泛型类型的擦除:
流。收集
因此,正如您在这里观察到的,
收集
调用的返回类型是Object
。这不能自动强制执行到List
下面的代码没有在OpenjDK 11上编译。在我看来,B中的test1应该覆盖A中的test1,因为: 方法有相同的名称。 这些方法具有相同的参数列表。 这些方法具有相同的可见性。 这些方法实际上不会抛出可能不兼容的检查异常。 它们的返回类型是协变的。 我使用了一个反编译器,分别对每个类进行反编译。编译后的代码实际上像我期望的那样工作。它用数字代替U扩展数字,用整数代替T扩展整数,以此类推。但当我
为什么需要泛型 前言 泛型程序最早出现1970年代的CLU和Ada语言中, 后来被许多机遇对象和面向对象的语言锁采用 1993年C++在3.0版本中引入的模板技术就属于泛型编程 1994年7月ANSI/ISO C++标准委员会通过的STL更是泛型编程的集大成者, 它已被纳入1998年9月C++标准之中. 2004年9月Java在J2SE 5.0(JDK 1.5)中开始使用泛型技术; 2005年11
问题内容: 我偶然发现该语句(从一些更复杂的代码中摘录)进行编译: 在短暂但快乐的时刻,我认为受检查的异常最终决定已经死亡,但是对此仍然感到遗憾: 该块不必为空;似乎可以有代码,只要该代码不引发检查异常即可。这似乎是合理的,但是我的问题是,语言规范中的哪个规则描述了此行为?据我所知,§14.18throw语句明确禁止使用它,因为表达式的类型是已检查的异常,并且不会被捕获或声明为被抛出。(?) 问题
这是我的代码: 有人能帮我解决这个错误吗?此错误是否与的属性值有关?
我用干净的架构在android项目上工作。 我有以下课程: 使用public dispose()方法从onNext实现中释放序列。 但我还是不明白使用它的好处。是否用于在销毁视图时从observable取消订阅,以便从转到并关闭发射器上的订阅?
我为JavaFX TableColumn创建了一个扩展函数,使得在没有重复样板的情况下实现cellFactory更加简洁。扩展函数定义如下: 为了格式化TableCell,我只需要定义TableCell中应该发生什么。当当前单元格有非空项可用时更新项。例如,要格式化LocalDateTime,我现在可以编写: 然后我继续定义另一个扩展来执行此操作,因此我可以编写: 此函数使用第一个函数,如下所示: