10

私は、モデリングツールで生成されたJavaクラスに暗黙的な変換を追加したいと考えています。だから私はコンパイラが自動的にそれらを見つけるように、それらのクラスのコンパニオンオブジェクトにそれらを追加したいと思います。コンパニオンは同じファイルに定義する必要があるため、別のファイルに追加することはできません。私はこれについて何かできることはありますか?Scalaでは、Javaで定義されたクラスのコンパニオンオブジェクトをどのように定義できますか?

私の暗黙的な変換はすべて別のオブジェクトに定義してから範囲に入れることができますが、これには余分なインポートが必要です。他の解決策?

+2

パッケージオブジェクトに暗黙的な変換を定義して、余分なインポートを避けることができます。 – axel22

+0

Javaクラスにはコンパニオンオブジェクトがありません。あなたは不正行為をしようとしていることを意味し、Javaクラスがコンパニオンオブジェクトを持っているように見えますか? –

+0

@Rex Kerr:うん、まあ、私はそれが不正行為と見なされたのか分からなかった。 @ axel22:良いアイデア、私はそれを先に進めるだろうと思う! –

答えて

9

です:

object domain { 

    type TimeUnit = java.util.concurrent.TimeUnit 
    object TimeUnit { 
    def valueOf(s : String) = java.util.concurrent.TimeUnit.valueOf(str) 
    val Millis = java.util.concurrent.TimeUnit.MILLISECONDS 
    //etc 
    } 

は、その後これを使用することができますコンパニオンオブジェクトを同じファイルに配置する以外の方法で定義することができます。あなたができる最良のものは、同じパッケージ名と余分なインポートを持つ非コンパニオンオブジェクトです。

カプセル化についての前提を壊さずにポストホップのコンパニオンを作成するには、非常に便利な機能であるため、http://groups.google.com/group/scala-debateに投稿してください。

9

私自身のプロジェクト固有のPredefのような配置でしばしばやる独自のコンパニオンオブジェクトを定義できます。たとえば:

import my.domain._ 
val tu : TimeUnit = TimeUnit.valueOf("MILLISECONDS") 

しかし、それは今方法がない現状で、あなたの domain.TimeUnitは、Scalaのコンパイラでモジュール(すなわちスカラ座 object

+0

それはコンパニオンオブジェクトではなく「スタンドアロンオブジェクト」でしょうか? (最終結果はここで同じです) – VonC

+3

少なくとも暗黙の変換(コンパニオンオブジェクトのスイートスポット)のためには動作しません –

+0

それは本当ですが、それはまだそれ自身のオブジェクトであり、 –

関連する問題