2016-03-10 10 views
8

に考えるには真実ではない、それは言う:は、Arrays.asListの制限は()この本でのJava第4版

は、Arrays.asList(の制限)は、それが最良の推測を取ることです約 リストの結果のタイプであり、 に割り当てられているものには注意しません。

本はJAVAによるブルースEckel氏この本のページに示すコードするただし、次のコードは正常に動作している

、反対280

public class Main{ 

    public static void main(String[] args) { 
     List<Snow> snow = Arrays.asList(new Light(), new Heavy()); 
    } 
} 
class Snow {} 
class Powder extends Snow {} 
class Light extends Powder {} 
class Heavy extends Powder {} 

のJava 1.8、IntelliJので考えるです、Windows 7 enter image description here

いずれかの考えがあります。

+0

Powder、Light、HeavyクラスはSnowクラスのプロパティを取得していますが、それは明らかにうまく動作します – Ajinkya

+2

2つのこと:まず、Listインターフェイスに少なくとも準拠しているので、問題はありません。何が問題になると思いますか?ここでは何もすぐに、これは明らかに大規模な間違っていることを飛び出していない... – Makoto

+0

@Makotoは申し訳ありませんが、私は質問を更新しました。 –

答えて

8

このコードはJava-7では失敗しますが、Java-8ではコンパイルされます。 javac 7u80を使用して私は参照してください:

Main.java:7: error: incompatible types 
       List<Snow> snow = Arrays.asList(new Light(), new Heavy()); 
              ^
    required: List<Snow> 
    found: List<Powder> 
1 error 

Java-8の型推論が大幅に改善されました。その前に、そのサブ式の解析に基づいて排他的にすべての部分式についてタイプが推論されたので、タイプはArrays.asList(new Light(), new Heavy())であり、周囲のコンテキストに関係なく知られている必要がありました。 Java-8では、周囲の文脈が表現型を説明することがあります。

Java言語仕様バージョン8には、型推論専用のwhole new chapterがあります。読むのはあまり簡単ではありませんが、すべての部分式に具体的な型を代入するのではなく、constraintsのセットが割り当てられています。私たちの場合、制約はLight <: T && Heavy <: Tです(正確な型はここでは推測されません)。次に、減算プロセスが実行され、制約セットが、expression compatibility constraintsを考慮して境界のセットに縮小される。

+0

はappriciateができますが、コンテキストと式の型をsurrondingについてもう少し深く説明してくださいます。?? –

+0

@VikrantKashyapは、私はいくつかの説明を追加しましたが、完全な詳細にこれを理解するために、あなたは仕様を読まなければなりません。 –

関連する問題