2017-12-12 14 views
1

で同じクラスの戻り値と同じタイプを拡張することができ、私はこのような何かを行うことができるようにしたい:がどのように二つの異なるクラスはScalaの

は、我々は2 ScalaはABをパッケージ化していると仮定します。 Bでは、私はこのような二つのクラス、持っている:

class Structure{ 
    case class StructureA(x:String, y:String) 
    case class StructureB(x:Int, y:Int) 
} 
class OperationB extend Structure{ 
    def optB(someData:String): Array[(StructureA,StructureB)] = {...} 
} 

をしてAで、私はこのような一つのクラスがあります。

import B.Structure 
class OperationA extend Structure { 
    def optA(data:Array[(StructureA,StructureB)]): Array[(StructureA,StructureB)] = {...} 
} 

そして、以下の私のプロジェクトエントリです:

import B.{Structure,OperationB } 
import A.OperationA 
object Main { 
    def main(args: Array[String]): Unit = { 


     val BInstance = new OperationB() 
     val BResult = BInstance.optB(someData) 

     val AInstance = new OperationA() 
     val AResult = AInstance.optA(BResult) 

    } 
} 

を問題は次のとおりです。

BResultはtypeof配列[(StructureA、StructureB)]ですが、cにすることはできませんompiled、エラーメッセージが

type mismatch, expected Array[(A.StructureA,A.StructureB)] actual Array[(B.StructureA,B.StructureB)] 

実際に私はそれにこのコードを追加して、それが正常にコンパイルすることができますが、私はそれが最善の解決策ではないと思います。

import B.{Structure,OperationB } 
    import A.OperationA 
    object Main { 
    def main(args: Array[String]): Unit = { 


     val BInstance = new OperationB() 
     val AInstance = new OperationA() 

     // here convert it into proper type. 
     val BResult = BInstance.optB(someData).map{ 
      case (a,b) => (a.asInstanceOf[AInstance.StructureA],b.asInstanceOf[AInstance.StructureB]) 
     } 


     val AResult = AInstance.optA(BResult) 

    } 
} 

私は長い間迷惑をかけていますが、誰でも助けてくれますか?

+0

のですか?パッケージAにも '構造'がありますか? (これは[XY問題](https://meta.stackexchange.com/q/66377)ですか?) –

+0

私はStructureA/StructureBをデータコンテナとして使用し、パッケージAには何もありません。 – Yang

答えて

1

コードでは、Structureの各インスタンスが独自のStructureAおよびStructureBタイプになります。彼らはStructureにアクセスしないので、そのようなことはありません。輸入品を節約するためにStructureを延長しようとするのは悪い考えです。あなたは `StructureA` /` StructureB`内部クラスを持っている必要がありますなぜ

代わり

package structure // or could be B.structure, or directly B 
case class StructureA(x:String, y:String) 
case class StructureB(x:Int, y:Int) 

// in A 
package A 
import structure._ 
class OperationA { 
    def optA(data:Array[(StructureA,StructureB)]): Array[(StructureA,StructureB)] = {...} 
} 

// in B 
package B 
import structure._ 
class OperationB { 
    def optB(someData:String): Array[(StructureA,StructureB)] = {...} 
} 

別のオプションは、

object Structure { 
    case class StructureA(x:String, y:String) 
    case class StructureB(x:Int, y:Int) 
} 
+0

ありがとう!あなたのソリューションはうまくいきますが、構造を拡張してインポートを保存するのは悪い考えです。最初にやりたいことはデータコンテナを宣言することでした。したがって、他のクラスはそれを拡張してコンテナのケースクラスを取得できます。 – Yang

関連する問題