2017-04-19 25 views
1

でオブジェクト型のパスを制限します。我々はContainer型を取る機能がある場合:は、我々は以下の持っていると言うコンパイル

def compute(c: Container): Unit 

をオブジェクトに渡されたパッケージcom.oneまたはcom.twoからであれば私たちは知ることができません。パッケージ2からContainerインスタンスを取得するための計算機能を制限する方法はありますか?言い換えれば、com.wo。*からのタイプを制限する方法がありますか? JavaやScalaでこれを行うことはできますか?

+0

@DavisBrodaいいえ、それは同じ質問ではありません。ここでの重要性は、具体的な型の名前ではありませんが、同じインタフェースから継承し、関数はインタフェースの型を取ります。しかし、両方の実装は異なるパッケージで定義されています。私は異なる名前を持つようにimplを更新しました。 – Mayumi

+0

それから、コンテナではなくcontainerImplTwoになり、問題は解決されます。 1つの実装だけが必要な場合は、なぜインタフェースを使用して始めていますか? –

+0

いいえ、Container型の実装は数多くあり、どちらのパッケージからでも実装できます。 – Mayumi

答えて

1

あなたはすることができます(あなたが本当に、本当に、本当にする必要がある場合、私が今まで多分以外com.oneで周りの既知のバグを動作させることをやったライブラリを見たら、私はすべてのコストでそれを回避しようと思います):

def compute(c: Container): Unit = { 
    if (c.getClass.getPackage.getName == "com.two") { 
    ... 
    } else { 
    // do nothing, or throw an exception, etc. 
    } 
} 

com.twoでクラスを拡張したクラスをサポートするように修正することもできます。

これはコンパイル時ではなく実行時に失敗するため、コンパイル時に失敗するマクロを作成する可能性があります。

+0

私たちはそれを正確にやり遂げました。 – Mayumi

関連する問題