2016-04-03 19 views
0

highlevel ve lowlevel adlı alt projeler içeren iki alt yapım yapmam var mı? Altproject highlevel, alt projeye lowlevel bağlıdır.Scala'da bir paket nesnesini geçersiz kılmak nasıl önlenir?

highlevel/src/main/scala/com/example/foo/package.scala yılında:

package com.example 

package object foo { 
    def bar = ??? 
} 

lowlevel/src/main/scala/com/example/foo/package.scala yılında: Her iki alt projeler paketine com.example.foo katkıda

package com.example 

package object foo { 
    def wee = ??? 
} 

yaşıyorum sorun olduğunu ben highlevel projesinde com.example.foo kullandığınızda, weelowlevel 'com.example.foo paket nesnesitarafından "gölgede kalıyor" olduğundan tanımlanmadı. highlevel alt projesine bar ve wee birlikte sahip olmanın herhangi bir yolu var mı?

(ilgilenenler için, kullanım durumunda bar ve wee örtük dönüşümler olduğunda geçerli:. weelowlevel tanımlanan bir tür içeren bir dönüşüm ele alabileceğinizi ise bar, highlevel tanımlanan bir tür içeren bir dönüşüm bakacaklarını Hem alt projeler gerek düşük düzeyli tip dönüşümleri wee.)

cevap

1

A package objectobject; package değil. Ne yapabilirsiniz lowlevel/src/main/scala/com/example/foo/LowLevel.scala için lowlevel/src/main/scala/com/example/foo/package.scala adlandırmak olduğunu

object A 
object A 

ve trait bir package object olarak değiştirin: Aşağıdaki kodu geçersiz aynı nedenle iki kez bir paket nesnesi tanımlamak mümkün değil.

Sonra üst düzey paket nesne onu devralabilir:

package com.example 
package object foo extends com.example.foo.LowLevel 

O paket nesneleri bu şekilde oluşabilir böylece özelliklerin şeyleri tanımlamak için oldukça yaygındır. Scalaz bunu kapsamlı yapıyor.

+0

Evet, bu soruyu yayınladıktan kısa bir süre sonra karşılaştım [SI-4964] (https://issues.scala-lang.org/browse/SI-4964), bu yüzden kasıtlı davranış ve tam olarak nedenini söyledin . –

+0

Örnekler için Scalaz kaynağına baktığımda, bunu sadece 'series/8.0.x' dalında ve' series/7.3.x' dalında iki tane yapan bir paket nesnesi bulabilirdim. Bir şey mi eksik? –

+0

Bu çözüm, yalnızca yüksek düzeyli paket nesnesi 'com.example.foo.LowLevel' öğesini genişletirse çalışır gibi görünüyor. Değilse, düşük düzeyli kod, "LowLevel" de tanımlanan kodu çağırırken çalışma sırasında bir "java.lang.NoSuchMethodError" atar. –

İlgili konular