2009-08-31 7 views
0

は、あなたが「I」という名前の2つのインタフェースがあります私のプロジェクトの中に気づくでしょう、私の問題Javaインタフェース「エイリアス」

#a.java 
package a; 
public interface I { 
//... 
} 

#b.java 
package b; 
public interface I { 
//... (different stuff from a.I) 
} 

の簡易版が含まれている以下の2つのJavaファイルを考えてみましょう。これは変更できません。 私は、1つのクラスの中で両方の型を使用する必要がある状況にあります。もちろん、それぞれの型をa.Iとb.Iとして参照できますが、読みやすさを維持する以外の方法では避けようとしています。

は、私は私がBとを使用することにより、Iのインタフェースを使用してみましょうことができ、この

interface B extends b.I { 

} 

このような何かをしたい、と私はインポートすることとしてa.I。問題は、これが機能しないということです。この具体的な例を使用してみましょう。

interface MyList extends List<String> { 
} 

MyList l = new ArrayList<String>(); 

これは型エラーを引き起こします。 MyListがListを拡張することをJavaが「認識」していないのはなぜですか?

また、私は上記の例では、鋳造しようとしましたが、それはClassCastExceptionが

思考を生成しますか?

答えて

6

これが有効である:

List<String> list = new MyList(); 

はこれではありません。

MyList l = new ArrayList<String>(); 

ArrayListMyListではありません。彼らはただ共通のスーパーインタフェースを持っています。それがうまくいかない理由です。 Javaは "0120"を知っていますがListを割り当てることはできません。

は考えてみましょう:

public interface MyList extends List<String> { 
    void foo(); 
} 

MyList l = new ArrayList<String>(); 
l.foo(); 

明らかArrayListfoo()メソッドを持っていません。

1

JavaはMyListList<String>を拡張することを知っているんが、それはまた、完全によくArrayList<String>MyListを実装していないことを知っています。あいまいさを取り除くことを強く推奨します。a.Ib.Iを使用してください。

1

あなたはスーパークラスまたはArrayList<String>のスーパーインタフェースではありませんMyListMyListためにArrayList<String>をキャストすることはできません。あなたが実際にMyList、たとえばMyList.swizzle()にメソッドを追加したふりをします。 Javaでキャストが許可されてからl.swizzle()と呼ばれるとどうなりますか?

Javaにはimport asタイプの名前変更ステートメントがないので、満足のいく解決策を見つけるつもりはないと思います。しかし、クラスの名前空間にメンバーを追加するインターフェースを実装することは、Java 1.5では禁忌です。そのルートを下ろす場合は、代わりにstatic importを試してみてください。それはあなたがやろうとしていることを行うために、今日は好都合なイディオムです。

関連する問題