フォトン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>
)。何かが暗黙のうちの戻り値の型キャストされたように見えますfilter
のStream<? extends MyClass, MyInterface>
どれを、その後につながるStream.concat
期待される型を返します。これは、で返されるストリーム内のすべての要素として意味的にはもちろん、安全でfilter
実装しましたMyInterface
。
なぜ、このコードは壊れたのか?どのように私は、以前の動作を得ることができますか?
概要:
- あなたのコードは無効です。
- 酸素のJavaコンパイラが誤ってコードをコンパイルすることができます。
- フォトンのJavaコンパイラが正しくコードでエラーを報告します。
concat()
連結されたストリームのタイプの最も近い一致であるタイプのストリームを返します。たとえば、あなたの場合で、その後は戻ります。concat()
Stream<Int>
Stream<Long>
concat()
Stream<Number>
そして、あなたならばconcat()
、その要素のような、お互いに何の関係負わない二つの流れStream<String>
とはStream<Long>
、その後、concat()
戻りますStream<Object>
。以来、それは、あなたのコードで何が起こるかMyClass
とMyInterface
持っていることから離れて、お互いに何の関係を負いません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()
、とフォトンで修正されたようです。それは間違っていたので、あなたはそれ以前の動作を望んではいけません。