EclipseのIDE Javaの暗黙的キャスト

OLEGSHA:

フォトンIにOxygen.3a(4.7.3)からの私のEclipse IDEのインストールを更新しながら、私のコードの一部は、以前に罰金をコンパイル(と作業)にもかかわらず、壊れていることに気づきました。

次のコードを考えてみます。

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);
    }

}

フォトンでは、エラーが表示されていると言ってStream.concatリターンをStream<Object>、ではありませんStream<MyInterface>酸素中で、それは(戻り値の型はしていませんでしたStream<MyInterface>)。何かが暗黙のうちの戻り値の型キャストされたように見えますfilterStream<? extends MyClass, MyInterface>どれを、その後につながるStream.concat期待される型を返します。これは、で返されるストリーム内のすべての要素として意味的にはもちろん、安全でfilter実装しましたMyInterface

なぜ、このコードは壊れたのか?どのように私は、以前の動作を得ることができますか?

skomisa:

概要:

  • あなたのコードは無効です。
  • 酸素のJavaコンパイラが誤ってコードをコンパイルすることができます。
  • フォトンのJavaコンパイラが正しくコードでエラーを報告します。

concat()連結されたストリームのタイプの最も近い一致であるタイプのストリームを返します。たとえば、あなたの場合、その後は戻りますconcat()Stream<Int>Stream<Long>concat()Stream<Number>

そして、あなたならばconcat()、その要素のような、お互いに何の関係負わない二つの流れStream<String>とはStream<Long>、その後、concat()戻りますStream<Object>以来、それは、あなたのコードで何が起こるかMyClassMyInterface持っていることから離れて、お互いに何の関係を負いませんObject親として。

何かが暗黙のうちに、次に期待される型を返すStream.concatにつながるストリームにフィルタの戻り値の型をキャストしたように見えます。

事実に合わせて表示されますが、あなたのフィルターで述語をテストするために変更された場合、何が起こるので、説明のルックスが魅力的なそのRunnable代わりにMyInterface

Stream<MyInterface> concatenation2 = Stream.concat(
    myClassStream.filter(element -> element instanceof Runnable),
    myInterfaceStream);

コードはまだコンパイルし、フィルタリングが明確に戻り値の型に影響を与えないようにツールチップは、変更されません。別の言い方をすれば、最初のパラメータがconcat()返されますStream<MyClass>関わらずに行われているもののをfilter()あなたのフィルタは、それはまた、唯一戻ってくることを保証しているという事実MyInterfaceの要素は関係ありませんが、からのストリームを受信する変数の型があるため重要であるように見えconcat()ましたStream<MyInterface>

以下からのストリームを受信する変数の型があれば、何が起こるconcat()から変更されたMyInterfaceような不条理と無意味なものにDeque<LocalDateTime>?...

Stream<Deque<LocalDateTime>> concatenation3 = Stream.concat(
    myClassStream.filter(element -> element instanceof MyInterface),
    myInterfaceStream);

二つのことが注目されます。

  • そのコードは明らかに無効であるにもかかわらず、それはまだ酸素にコンパイルします(ただし、フォトン上)。
  • 以下のためのツールチップconcat()になりましたがあることをその戻り値の型を示しStream<Deque<LocalDateTime>>、明らか意味をなさないいます。

なぜ、このコードは壊れたのか?どのように私は、以前の動作を得ることができますか?

酸素のコンパイラは無効な変数定義が使用可能だったStream.concat()、とフォトンで修正されたようです。それは間違っていたので、あなたはそれ以前の動作を望んではいけません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=218966&siteId=1