到目前为止,我认为有效的 final和final或多或少是等效的,如果在实际行为中不相同,JLS 会将它们相似地对待。然后我发现了这个人为的场景:
final int a = 97;
System.out.println(true ? a : 'c'); // outputs a
// versus
int a = 97;
System.out.println(true ? a : 'c'); // outputs 97
Run Code Online (Sandbox Code Playgroud)
显然,JLS 在这里两者之间产生了重要区别,我不知道为什么。
我阅读了其他主题,例如
但他们没有详细说明。毕竟,在更广泛的层面上,它们似乎几乎是等价的。但深入挖掘,它们显然不同。
是什么导致了这种行为,谁能提供一些解释这一点的 JLS 定义?
编辑:我发现了另一个相关的场景:
final String a = "a";
System.out.println(a + "b" == "ab"); // outputs true
// versus
String a = "a";
System.out.println(a + "b" == "ab"); // outputs false
Run Code Online (Sandbox Code Playgroud)
所以字符串实习在这里的行为也不同(我不想在实际代码中使用这个片段,只是对不同的行为感到好奇)。
我想从我的数据库" Logs "中选择最大行号并将其存储在变量中m.
这是我的代码:
ResultSet rs = stmt.executeQuery("Select max(Line) as L from logs");
while (rs.next()) { // Why do I need this
int m = rs.getInt("L");
System.out.println(m);
}
Run Code Online (Sandbox Code Playgroud)
但除非我使用,否则它不起作用while(rs.next()).
如果我理解正确,rs.next()将光标移动到下一行,但在这里,在这个结果中,我只有一行.
那么,有人可以解释为什么循环是必要的吗?我唯一能想到的是第一个光标是在列名上设置的,我是对的吗?
我知道在 Java 中整数文字默认是int,所以如果我写这样的东西
byte byteValue = 2;
Run Code Online (Sandbox Code Playgroud)
Java 自动将文字值2(默认为 int)转换为字节。如果我写同样的事情
byte byteValue = 4/2;
Run Code Online (Sandbox Code Playgroud)
RHS 被评估为一个 int 并隐式转换为一个字节。
但是为什么在以下两种情况下不会发生隐式转换?
int n1 = 4;
byte value = n1/2;
Run Code Online (Sandbox Code Playgroud)
或在此
byte n1 = 4;
byte value = n1/2;
Run Code Online (Sandbox Code Playgroud)
我知道这两个示例的 RHS 都被评估为int。但是为什么Java不像前两种情况那样将其隐式转换为字节。是否只有在存在文字时才会隐式转换为较小的数据类型?
我正在流式传输实现接口的类的对象。我想将它们收集为接口的元素列表,而不是实现类。
这对于 Java 16.0.1 的Stream#toList方法似乎是不可能的。例如在下面的代码中,最后一条语句将无法编译。
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class WhyDodo {
private interface Dodo { }
private static class FancyDodo implements Dodo { }
public static void main(String[] args) {
final List<Dodo> dodos = Stream.of(new FancyDodo()).collect(Collectors.toList());
final List<FancyDodo> fancyDodos = Stream.of(new FancyDodo()).toList();
final List<Dodo> noFancyDodos = Stream.of(new FancyDodo()).toList();
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以显式地将每个元素从 转换FancyDodo为Dodo。但至少为了简洁起见,我们也可以使用.collect(Collectors.toList()).
为什么我不能使用 Stream#toList 在 Java 16 中收集类的接口列表?
如果有人有比明确投射更好的解决方案,我也很乐意听到:)
我的印象Foo::new只是语法糖() -> new Foo(),他们应该表现得相同.但似乎并非如此.这是背景:
使用Java-8,我使用第三方库,它有一个Optional<Foo> foo和这个违规行:
foo.orElseGet(JCacheTimeZoneCache::new);
Run Code Online (Sandbox Code Playgroud)
JCacheTimeZoneCache在构造函数中使用来自可选JCache库的东西,我没有在我的类路径中.使用调试器我验证了foo不是null,因此它实际上应该永远不会实例化JCacheTimeZoneCache实例,因此丢失的JCache库应该不是问题.然而,它确实爆炸,堆栈跟踪抱怨丢失的JCache库:
Caused by: java.lang.BootstrapMethodError: java.lang.IllegalAccessError: no such constructor: net.fortuna.ical4j.util.JCacheTimeZoneCache.<init>()void/newInvokeSpecial
at net.fortuna.ical4j.model.TimeZoneLoader.cacheInit(TimeZoneLoader.java:275) ~[ical4j-3.0.0.jar:na]
at net.fortuna.ical4j.model.TimeZoneLoader.<init>(TimeZoneLoader.java:81) ~[ical4j-3.0.0.jar:na]
at net.fortuna.ical4j.model.TimeZoneRegistryImpl.<init>(TimeZoneRegistryImpl.java:125) ~[ical4j-3.0.0.jar:na]
at net.fortuna.ical4j.model.TimeZoneRegistryImpl.<init>(TimeZoneRegistryImpl.java:116) ~[ical4j-3.0.0.jar:na]
at net.fortuna.ical4j.model.DefaultTimeZoneRegistryFactory.createRegistry(DefaultTimeZoneRegistryFactory.java:48) ~[ical4j-3.0.0.jar:na]
at net.fortuna.ical4j.data.CalendarBuilder.<init>(CalendarBuilder.java:105) ~[ical4j-3.0.0.jar:na]
at de.malkusch.trashcollection.infrastructure.schedule.ical.VEventRepository.downloadVEvents(VEventRepository.java:46) ~[classes/:na]
at de.malkusch.trashcollection.infrastructure.schedule.ical.VEventRepository.<init>(VEventRepository.java:35) ~[classes/:na]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_172]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_172]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_172]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_172]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:170) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
... 80 common frames omitted
Caused by: java.lang.IllegalAccessError: no such constructor: net.fortuna.ical4j.util.JCacheTimeZoneCache.<init>()void/newInvokeSpecial
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:483) ~[na:1.8.0_172]
... 93 …Run Code Online (Sandbox Code Playgroud) 我想检查一下是否LocalTime是午夜.对于这种使用情况午夜被定义为任何之间23:59和00:01.这是2分钟的范围.
private final LocalTime ONE_MINUTE_BEFORE_MIDNIGHT = LocalTime.of(23, 59, 0);
private final LocalTime ONE_MINUTE_AFTER_MIDNIGHT = LocalTime.of(0, 1, 0);
Run Code Online (Sandbox Code Playgroud)
我有一个方法
public boolean isAtMidnight(LocalTime time) {
return time.isAfter(ONE_MINUTE_BEFORE_MIDNIGHT)
&& time.isBefore(ONE_MINUTE_AFTER_MIDNIGHT);
}
Run Code Online (Sandbox Code Playgroud)
此方法始终返回false.即使是LocalTime.MIDNIGHT.但它应该回归true.
如何查看+-1午夜时间是否分钟?
我是 Java 新手,来自 C++ 背景,我试图理解接口和实现接口的抽象类的概念。当抽象类实现接口时到底发生了什么?这是否像继承一样工作,即所有接口方法也属于抽象类,即使它们没有在其中实现?或者只有实现的方法属于抽象类?那么implements和extends除了一个用于实现接口,另一个用于继承之外,还有什么区别吗?
使用HttpClientJava 11(JDK,而不是 Apache),如何重试请求?
假设我想重试一个请求最多10 次,如果它没有返回状态代码或200抛出异常。
目前,我正在循环中重新安排返回的未来,我想知道是否有更好或更优雅的方式。
CompletableFuture<HttpResponse<Foo>> task = client.sendAsync(request, bodyHandler);
for (int i = 0; i < 10; i++) {
task = task.thenComposeAsync(response -> response.statusCode() == 200 ?
CompletableFuture.completedFuture(response) :
client.sendAsync(request, bodyHandler));
}
// Do something with 'task' ...
Run Code Online (Sandbox Code Playgroud)
如果我们也为特殊情况添加重试,我最终会得到
CompletableFuture<HttpResponse<Foo>> task = client.sendAsync(request, bodyHandler);
for (int i = 0; i < 10; i++) {
task = task.thenComposeAsync(response ->
response.statusCode() == 200 ?
CompletableFuture.completedFuture(response) :
client.sendAsync(request, bodyHandler))
.exceptionallyComposeAsync(e -> …Run Code Online (Sandbox Code Playgroud) Java提供了以2、8、10和16为基数编写数字文字的方法。
我想知道为什么包括基数8,例如int x = 0123;?
我认为可能存在类似于十六进制的一个字节的容量为FF + 1等等的事实。
我想比较2个LocalDateTime对象而不考虑纳秒.这就是我目前正在做的事情.这有什么更好的方法吗?
LocalDateTime object1 = LocalDateTime.of(2014, 3, 30, 12, 30, 23, 12000);
LocalDateTime object2 = LocalDateTime.of(2014, 3, 30, 12, 30, 23, 12004);
System.out.println(object1.isEqual(object2)); // false
LocalDateTime objec1tWithoutNano = object1.minusNanos(object1.getNano());
LocalDateTime objec2tWithoutNano = object2.minusNanos(object2.getNano());
System.out.println(objec1tWithoutNano.isEqual(objec2tWithoutNano)); // true
Run Code Online (Sandbox Code Playgroud)