簡體   English   中英

Eclipse IDE Java隱式轉換

[英]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> )。 看起來有些東西隱含地將返回類型的filterStream<? extends MyClass, MyInterface> Stream<? extends MyClass, MyInterface>然后導致Stream.concat返回預期的類型。 當然,這在語義上是安全的,因為filter返回的流中的所有元素都實現了MyInterface

為什么這段代碼破了? 我怎么能得到以前的行為?

摘要:

  • 您的代碼無效。
  • Oxygen的Java編譯器錯誤地允許您的代碼進行編譯。
  • Photon的Java編譯器正確地報告了代碼的錯誤。

concat()將返回一個類型的Stream,它與被連接的流類型最匹配。 例如,如果使用Stream<Long> concat() Stream<Int> ,則concat()將返回Stream<Number>

如果你concat()兩個元素彼此沒有關系的Stream<String> ,比如Stream<String>Stream<Long> ,那么concat()將返回一個Stream<Object> 這就是你的代碼中發生的事情,因為除了將Object作為父代之外, MyClassMyInterface沒有任何關系。

看起來有些東西隱式地將過濾器的返回類型轉換為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);

有兩點值得注意:

  • 即使該代碼顯然無效,它仍然可以在Oxygen上編譯(但不能在Photon上編譯)。
  • concat()的工具提示現在將其返回類型顯示為Stream<Deque<LocalDateTime>> ,這顯然沒有意義。

為什么這段代碼破了? 我怎么能得到以前的行為?

Oxygen的編譯器使用Stream.concat()允許無效的變量定義,而且似乎這在Photon中得到了修復。 您不應該想要之前的行為,因為它不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM