2017-03-23 7 views
1

これらの2つの例は、Oracle Java 8 JDKを使用してコンパイルされません。Java8でバウンド・タイプのコンパイル・エラー

エラーは次のとおりです。

error: incompatible types: Object cannot be converted to Integer for (Integer i : foo.set)

例1)

import java.util.Set; 

class Foo<T> 
{ 
    protected Set<Integer> set; 
} 

class Foo2 extends Foo 
{ 
    void doit() 
    { 
     for (Integer i : set) 
     { 

     } 
    } 
} 

例2)それはバグや機能

import java.util.Set; 

class Foo<T> 
{ 
    public Set<Integer> set; 
    public static void main(String[] args) 
    { 
     Foo foo = new Foo(); 
     for (Integer i : foo.set) 
     { 

     } 
    } 
} 

ですか?私が理解できるようにジェネリックスは、生のタイプの分野では機能しません。

+1

、これはコンパイルん:あなたは、新しいインスタンスを作成するために、ジェネリック型を渡す必要があります= new Foo <>(); ' –

+1

生の型を使用している可能性があります。すべての型情報が、そのすべてのフィールドに消去されています。 'Set 'は 'Set'になります。 –

+0

なぜ生の型を使用しますか? –

答えて

0

エラーではありません。たとえば、 `Fooの FOO - それはInteger``として入力いない場合でも、あなたは型指定されたオブジェクトとして `Foo`を構築する場合には不思議な

class Foo<T> 
{ 
    public Set<Integer> set; 
    public static void main(String[] args) { 

     Foo<Integer> foo = new Foo(); // changed code 

     for (Integer i : foo.set) 
     { 

     } 
    } 
} 
+0

型パラメータ 'T'が実際には使用されていないという点がありました。エラーは新しいインスタンスを作成することではなく、質問のコードは単に生の型を作成します。 –

+0

これを理解して、意識的に生の型を作りました。生の型はjavaでは禁止されていません。ここでは、を生の型ではなく、生のFooの中に設定します。コンパイラは、生のオブジェクトFooのすべてのフィールド型を無視します。おかしいです。 –

+0

@DenisPimenov **しないでください。これまでつかいます。生のタイプ。**禁止されていない唯一の理由は、下位互換性のためです。しかし、新しいコードを書くときは、常に**型パラメータを使用します。 [this post](http://stackoverflow.com/a/2770692/507738)を参照してください。さらに、[JLS、§4.8](https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.8)でも、「使用を許可しない可能性があります生の型の "*。 –

関連する問題