为什么在返回类型交集时需要显式转换?

Why is an explicit cast required when returning a type intersection?

Nicolai Parlog's blog post on intersection types with var 显示了一种方法,createCloseableIterator(),即 returns 交集类型:

@SuppressWarnings("unchecked")
private static <T extends Closeable & Iterator<String>>
        T createCloseableIterator(boolean empty) {
    if (empty)
        return (T) new Empty();
    else
        return (T) new Scanner(System.in);
}

其中 EmptyScanner 都实现了 Iterator<String>Closeable

为什么需要显式转换为 (T)

这不是因为类型交集,而是因为你要返回一个 T,它是由方法的调用者选择的,可能是一个不同的类型,不是 ScannerEmpty.

如果您尝试将结果存储在其他所选类型的变量中,这将导致 class 转换异常,例如:

class Other implements Closeable, Iterator<String> { ... }

Other e = createCloseableIterator(false);