2016-05-25 10 views
0

すべての情報を読みましたが、この基本的なオーバーライドが不可能な理由はまだ見つかりません。説明してください。ジェネリックでメソッドをオーバーライドする最も単純な例

class Fruit{} 
class Apple extends Fruit{} 

class Parent { 
    public Set<Fruit> getIt(){ 
    return null; 
    } 
} 

class Child extends Parent { 
    @Override // THIS DOESN'T WORK 
    public Set<Apple> getIt(){ 
     return null; 
    } 
} 

答えて

2

を、それが上書きされていないため。あなたが望むのは共分散と呼ばれます。つまり、返品タイプSet<Apple>のサブクラスChildの元のメソッドの元のメソッドSet<Fruit>の返品タイプのサブタイプの優先メソッドを使用することを意味します。

しかし、残念ながら、Set<Apple>AppleFruitのサブタイプである場合でも、JavaでSet<Fruit>のサブタイプではありません。あなたはSet<Apple>Set<Fruit>たならば、あなたはスーパークラスで可能なものは、サブクラスで可能であるようSet<Apple>Bananaを追加することができるだろう、Set<Fruit>に任意のFruitを追加することができます...

:非常に単純な理由

だからSet<Fruit>Set<Apple>は無関係のタイプであり、これは無効にすることを禁じます。

+1

完了するだけです。アレイは共変種である。だから、このコードはうまくいくはずです。\t \tクラスフルーツ{} \tリンゴ果実{} \t \tクラスの親を拡張\tクラス{ \t \t公共フルーツ[] getIt(){ \t \t \t戻りヌル。 \t \t} \t \t} \t \tクラスの子供は、親{ \t \t @Override //これは \t \t公共アップル[] getIt(){ \t \t \t戻りヌルを動作するに延在。 \t \t} \t \t} – Veeram

+0

確か。もちろん、配列共分散の型に違反しようとすると、例外がスローされます。配列の共分散型の安全性は、実行時に強制されます。 –

0
class Fruit{} 
class Apple extends Fruit{} 

class Parent { 
    public Set<? extends Fruit> getIt(){ 
     return null; 
    } 
} 

class Child extends Parent { 
    @Override // THIS DOESN'T WORK 
    public Set<Apple> getIt(){ 
     return null; 
    } 
} 

が、クラスは(SuperFruitのような)他のクラスをサブクラス化し、あなたの親getIt()方法

+0

この回答は、ここで何をしているのかの説明を追加することで改善される可能性があります。 –

+0

@TobiasBrösamleはこのキーワードで<? extendsクラス>あなたの戻り値の型はあなたのクラスを拡張するすべてを受け入れます!メソッドをオーバーライドすると戻り値の型を変更できなくなるので、 –

+0

私は '<? extends Class>は意味しますが、OPはそうではないと思います。だからこそ私はあなたのコードが何をしているのか、あなたの答えにその問題をどのように解決するのかについての説明を追加するように頼んだのです。 –

2

にフルーツの代わりにそれを使用する果物を作るためには自分自身のサブクラスその良いとは限りませんので、オーバーライドされたメソッドの戻り値の型は、オーバーライドされたメソッドの戻り値の型のサブタイプでなければなりません。 AppleFruitのサブタイプですが、Javaジェネリックはタイプパラメータ内で不変であるため、Set<Apple>Set<Fruit>のサブタイプであることを意味するわけではありません。タイプの境界を使用してあなたがこの問題を解決することができ

Parent p = new Child(); 
Set<Fruit> fruitSet = p.getIt(); // actually a Set<Apple> 
fruitSet.add(new Fruit());  // oops! 

そうしないとあなたのようなことを行うことができ

class Parent { 
    public Set<? extends Fruit> getIt() { 
     return null; 
    } 
} 

class Child extends Parent { 
    @Override 
    public Set<Apple> getIt(){ 
     return null; 
    } 
} 
関連する問題