小编Zab*_*uza的帖子

有效地最终与最终 - 不同的行为

到目前为止,我认为有效的 finalfinal或多或少是等效的,如果在实际行为中不相同,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)

所以字符串实习在这里的行为也不同(我不想在实际代码中使用这个片段,只是对不同的行为感到好奇)。

java final jls language-lawyer effectively-final

103
推荐指数
2
解决办法
3137
查看次数

为什么这里需要"while(rs.next())"?

我想从我的数据库" 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 jdbc

41
推荐指数
4
解决办法
4472
查看次数

Java 中的隐式转换是如何工作的?

我知道在 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 casting type-conversion implicit-conversion narrowing

34
推荐指数
3
解决办法
1325
查看次数

为什么我不能使用 Stream#toList 在 Java 16 中收集类的接口列表?

我正在流式传输实现接口的类的对象。我想将它们收集为接口的元素列表,而不是实现类。

这对于 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)

我们可以显式地将每个元素从 转换FancyDodoDodo。但至少为了简洁起见,我们也可以使用.collect(Collectors.toList()).

为什么我不能使用 Stream#toList 在 Java 16 中收集类的接口列表?

如果有人有比明确投射更好的解决方案,我也很乐意听到:)

java generics type-inference java-stream java-16

21
推荐指数
3
解决办法
1051
查看次数

Foo :: new和() - > new Foo()有什么区别?

我的印象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)

java lambda method-reference

20
推荐指数
1
解决办法
536
查看次数

LocalTime在23.59和00:01之间

我想检查一下是否LocalTime是午夜.对于这种使用情况午夜被定义为任何之间23:5900: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 time localtime java-time

15
推荐指数
2
解决办法
1627
查看次数

当抽象类在 Java 中实现接口时会发生什么

我是 Java 新手,来自 C++ 背景,我试图理解接口和实现接口的抽象类的概念。当抽象类实现接口时到底发生了什么?这是否像继承一样工作,即所有接口方法也属于抽象类,即使它们没有在其中实现?或者只有实现的方法属于抽象类?那么implements和extends除了一个用于实现接口,另一个用于继承之外,还有什么区别吗?

java inheritance interface abstract

13
推荐指数
1
解决办法
1万
查看次数

重试 HTTP 请求(Java 11 - HttpClient)

问题

使用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 http request retry-logic java-http-client

12
推荐指数
1
解决办法
2万
查看次数

八进制数(以8为底)有什么用?

Java提供了以2、8、10和16为基数编写数字文字的方法。

我想知道为什么包括基数8,例如int x = 0123;

我认为可能存在类似于十六进制的一个字节的容量为FF + 1等等的事实。

java literals octal

11
推荐指数
2
解决办法
934
查看次数

在java 8中比较没有纳秒的LocalDateTime

我想比较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)

java java-8

9
推荐指数
1
解决办法
1048
查看次数