2016-08-04 6 views
3

汎用インターフェース(Pack<A extends PackAnimal>)には、List<A>を戻すメソッドが1つあります。今日、私はなぜそれがあるリストを返すメソッドを持つ汎用インターフェース

interface PackAnimal { 
} 
class Buffalo implements PackAnimal { 
} 

interface LonelyAnimal { 
} 
class Puma implements LonelyAnimal { 
} 

interface Pack<A extends PackAnimal> { 
    List<A> getMembers(); 
} 

class PumaPack implements Pack { 

    @Override 
    public List<Puma> getMembers() { 
     return null; 
    } 
} 

もし私がクラスをspeficyすることを忘れインターフェース(class XXX implements PackAnimal)を実装するクラスでは、戻り値の型は、実行時にコンパイル時にチェックし、失敗していないことを発見しましたか?宣言に何らかのタイプの間違いがあった場合、コンパイルが失敗することはどうすれば強制できますか?

答えて

1

Raw Typesを使用した場合、怖い結果になりました。

<...>どこかでそれを逃すと、コンパイラはあなたのコードをレガシーとして扱い、通常の型チェックの多くはしません。 MOstコンパイラは最善を尽くしていますが、チェックプロセスで大きな穴が残っています。

interface PackAnimal { 
} 

class Buffalo implements PackAnimal { 
} 

interface LonelyAnimal { 
} 

class Puma implements LonelyAnimal { 
} 

interface Pack<A extends PackAnimal> { 
    // Obviously fine. 
    List<A> getMembers(); 
} 

// Raw type so no checking. 
class PumaPack implements Pack { 

    @Override 
    public List<Puma> getMembers() { 
     // Raw typed class so Puma isn't checked for PackAnimal super. 
     return Arrays.asList(new Puma()); 
    } 
} 

class Six { 

} 

// Properly typed so Raw Types not happening. 
class SixPack implements Pack<Six> { 

    @Override 
    // NOT ALLOWED: Attempt to use incompatible return type!!! 
    public List<Six> getMembers() { 
     return null; 
    } 
} 
+0

素敵な、生の種類を無効にするフラグhttp://stackoverflow.com/questions/697879/javac-flag-to-disallow-raw-types – Narkha

2

あなたのリストは不明なタイプで宣言されています。

// compile warning 
class PumaPack implements Pack { 
    List getMembers() {return null;} 
} 
:しかし、あなたは、コンパイラ 警告を取得します、

interface Pack<A extends PackAnimal> { 
    List<A> getMembers(); 
} 

// won't compile because Puma not within bound 
class PumaPack implements Pack<Puma> { 
    List<Puma> getMembers() {return null;} 
} 

// compiles OK 
class BuffaloPack implements Pack<Buffalo> { 
    List<Buffalo> getMembers() {return null;} 
} 

しかし、あなたはあなたのPumpPackの例のように(欠落しているタイプ)の実装をコーディング誰かを停止することはできません:クラス型を使用します

警告がある場合、コンパイルが失敗するように設定した場合:

javac -Werror ... 

生の種類の場合でも私たちの目標。

+0

はまた、コンパイルされます。私のテストでhttps://ideone.com/Gzr9tp – Narkha

+0

@narkレア私の編集した答え – Bohemian

+0

、それはそれ4castle @パック '' – 4castle

関連する問題