为什么在返回类型交集时需要显式转换?
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);
}
其中 Empty
和 Scanner
都实现了 Iterator<String>
和 Closeable
。
为什么需要显式转换为 (T)
?
这不是因为类型交集,而是因为你要返回一个 T
,它是由方法的调用者选择的,可能是一个不同的类型,不是 Scanner
或 Empty
.
如果您尝试将结果存储在其他所选类型的变量中,这将导致 class 转换异常,例如:
class Other implements Closeable, Iterator<String> { ... }
Other e = createCloseableIterator(false);
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);
}
其中 Empty
和 Scanner
都实现了 Iterator<String>
和 Closeable
。
为什么需要显式转换为 (T)
?
这不是因为类型交集,而是因为你要返回一个 T
,它是由方法的调用者选择的,可能是一个不同的类型,不是 Scanner
或 Empty
.
如果您尝试将结果存储在其他所选类型的变量中,这将导致 class 转换异常,例如:
class Other implements Closeable, Iterator<String> { ... }
Other e = createCloseableIterator(false);