2012-03-01 15 views
7

私はInterfaceというインターフェースと、もう少し複雑にするために、いくつかの引数を必要とするctorを持つBaseという具象クラスを持っているとします。匿名のクラスを拡張し、同時にインターフェイスを実装していますか?

Baseを拡張してInterfaceを実装する匿名クラスを作成したいと思います。私には合理的に見えますが、それは動作しません

Interface get() 
{ 
    return new Base (1, "one") implements Interace() {}; 
} 

よう

何か!

(P.S:実際には、インターフェイスとベースも、一般的なクラスです:Dしかし、私は今のところそれを無視します)

+0

ジェネリックなものは悪夢になることがあり多くの抽象化。それを簡単に保つ;) –

答えて

1

これを

は個人的に
class Base { 
} 

interface Interface { 
} 

public class Test { 
    public static void main(String[] args) { 
     class Foo extends Base implements Interface { 
     }; 

     Foo x = new Foo(); 
    } 
} 

私は通常、静的な入れ子になったクラス自身にこれを引き出すだろうが、それはあなたの選択です:あなたが本当ににかかわらたい場合は、メソッド内の名前のクラスを作成することができますシナリオは私にはほとんど意味がありません。クラスBaseがこれですと仮定します:

class Base { 
    public void foo(); 
} 

Interfaceはこれです:

interface Interface { 
    public void bar(); 
} 

今、あなたはこのようになります匿名クラスを作成したい:

class MyClass extends Base implements Interface { 
} 

この理由はここにありますMyClassbarからBaseに継承される(または場合によってはオーバーライドされる)ことを意味し、mエドfooからInterface。これまでのところ、あなたのクラスはどちらの方法でもこの2つの方法を持っています。

Interfaceが提供する機能、つまりメソッドfooを取得するだけで、メソッドのタイプがInterfaceのオブジェクトを返すとどうなるか考えてみましょう。 barが失われています(アクセスできません)。これは2例に私たちをダウンさせます:あなたは新しいオブジェクトがInterfaceと見られているので、そのメソッドを使用して取得していないためBaseを拡張

  1. は無用です。
  2. Interfaceも方法fooを持っているが、それはあなただけの直接Baseを拡張することができるようにBase自体は、Interfaceを実装する必要があることを意味します:あまりにも存在する場合
class Base implements Interface { 
    public void foo(); 
    public void bar(); 
} 

class MyClass extends Base { 
} 
+0

まあ、私は "インターフェイスを実装する"の意図は、単にキャストを実行することだったと思います。私は具体的な例を使用します。 Collectionクラスを拡張するViewClassがあります。次に、このViewClassを使用してキーセットと値セットを実装します。 ViewClassに実装されていることを何とかしていたとします。つまり、キーセットまたは値セットのいずれかのコードを追加する必要はありません。世話をするために残された唯一のものはタイプです。明らかに、keysSet()は集合を返さなければならないが、values()はCollectionを返さなければならない。それで、別の言い方をすると、私は[戻る(Set )の新しいBase(...)]を返すことができますか? – user113454

+0

どのように 'MyClass'は匿名ですか?それは名前があります! –

+0

@Jon Skeet、正確には私は名前を使って説明でそれを参照することができます。 – Tudor

11

いいえ、あなたは匿名クラスであることを行うことはできません。 ...

+0

私は私たちがメソッドの中にクラスを持つことができるか分からなかった! – user113454

+0

@ user1064918:これはめったに使われておらず、正当な理由で読むのは難しいです。 –

+0

@JonSkeet私はこれをセットアップしましたが、方法の中で名前付きクラスを利用する以外の方法はありません。それらは、型キャストが期待される型を満たすようにするためだけに使用されます。 https://gist.github。com/imminent/5248440あなたが別の方法を知っていれば、私は興味があります。あるいは、メソッドを使って名前付きクラスを正しく正当に使用していると思っています。 –

関連する問題