[英]Eclipse IDE Java implicit casting
在將我的Eclipse IDE安裝從Oxygen.3a(4.7.3)更新為Photon時,我注意到盡管以前編譯(和工作)很好,但我的一些代碼已經破壞了。
請考慮以下代碼:
import java.util.ArrayList;
import java.util.stream.Stream;
public class Test {
class MyClass {
}
interface MyInterface {
}
public static void main(String[] args) {
Stream<MyClass> myClassStream = new ArrayList<MyClass>().stream();
Stream<MyInterface> myInterfaceStream = new ArrayList<MyInterface>().stream();
Stream<MyInterface> concatenation = Stream.concat(
// Tooltip for filter() displays the result type of Stream<MyClass>
myClassStream.filter(element -> element instanceof MyInterface),
// Tooltip displays type Stream<MyInterface>
myInterfaceStream);
}
}
在Photon中,出現錯誤,說Stream.concat
返回Stream<Object>
,而不是Stream<MyInterface>
。 在Oxygen中,它沒有(返回類型是Stream<MyInterface>
)。 看起來有些東西隱含地將返回類型的filter
為Stream<? extends MyClass, MyInterface>
Stream<? extends MyClass, MyInterface>
然后導致Stream.concat
返回預期的類型。 當然,這在語義上是安全的,因為filter
返回的流中的所有元素都實現了MyInterface
。
為什么這段代碼破了? 我怎么能得到以前的行為?
摘要:
concat()
將返回一個類型的Stream,它與被連接的流類型最匹配。 例如,如果使用Stream<Long>
concat()
Stream<Int>
,則concat()
將返回Stream<Number>
。
如果你concat()
兩個元素彼此沒有關系的Stream<String>
,比如Stream<String>
和Stream<Long>
,那么concat()
將返回一個Stream<Object>
。 這就是你的代碼中發生的事情,因為除了將Object
作為父代之外, MyClass
和MyInterface
沒有任何關系。
看起來有些東西隱式地將過濾器的返回類型轉換為Stream,然后導致Stream.concat返回預期的類型。
這個解釋看起來很誘人,因為它似乎符合事實,但是如果過濾器中的Predicate被更改為測試Runnable
而不是MyInterface
什么?
Stream<MyInterface> concatenation2 = Stream.concat(
myClassStream.filter(element -> element instanceof Runnable),
myInterfaceStream);
代碼仍然編譯並且工具提示未更改,因此過濾顯然不會影響返回類型。 換句話說, concat()
的第一個參數將返回Stream<MyClass>
無論filter()
做了什么。 您的過濾器保證它也只返回MyInterface
元素這一事實並不重要,但它似乎很重要,因為從concat()
接收Stream的變量類型是Stream<MyInterface>
。
如果從concat()
接收Stream的變量的類型從MyInterface
變為荒謬無意義的東西,如Deque<LocalDateTime>
什么?
Stream<Deque<LocalDateTime>> concatenation3 = Stream.concat(
myClassStream.filter(element -> element instanceof MyInterface),
myInterfaceStream);
有兩點值得注意:
concat()
的工具提示現在將其返回類型顯示為Stream<Deque<LocalDateTime>>
,這顯然沒有意義。 為什么這段代碼破了? 我怎么能得到以前的行為?
Oxygen的編譯器使用Stream.concat()
允許無效的變量定義,而且似乎這在Photon中得到了修復。 您不應該想要之前的行為,因為它不正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.