2012-10-24 15 views
14

Mam Scala Klasa:wystąpienia klasy Scala z Java i użyj domyślnych parametrów konstruktora

class Foo(val x:String = "default X", val y:String = "default Y") 

chcę zadzwonić z Java, ale przy użyciu domyślnych parametrów

Podania null nie działa (to przypisuje null, zgodnie z oczekiwaniami)

new Foo(null,null); //both are instantiated as null 

Ta sztuczka nie działa dla mnie, ale to brzydkie, i zastanawiam się, czy istnieje lepszy sposób:

Scala

class Foo(val x:String = "default X", val y:String = "default Y") { 
    def this(x:Object) = this() 
} 

Java

new Foo(null); //no matter what I pass it should work 

Jednak chciałbym jak pozbyć się sztuczki przeciążenia konstruktora i użyć konstruktora 0 param

Czy to możliwe?

Odpowiedz

7

Wydaje się, nie ma takiego sposobu: https://issues.scala-lang.org/browse/SI-4278

Issue: default-args konstruktor nie powinny być generowane dla klas ze wszystkimi-opcjonalnych argumentów
...

Lukas Rytz: w odniesieniu do jednolitości językowej zdecydowaliśmy się nie naprawiać tego - ponieważ jest to problem z interoperacyjnością z frameworkami, uważamy, że nie powinno to być ustalone na poziomie językowym.

obejścia: Powtórz domyślne lub abstrakcyjne nad jednym, lub umieścić jedno domyślne int konstruktora zerowego argumentu

Następnie Lukas proponuje to samo rozwiązanie jak znalazł:

class C(a: A = aDefault, b: B = C.bDefault) { 
    def this() { this(b = C.bDefault) } 
} 
object C { def bDefault = ... } 

// OR 

class C(a: A = aDefault, b: B) { 
    def this() { this(b = bDefault) } 
} 
1

Ogólniej jeśli masz klasę Scala z domyślnymi argumentami i chcesz utworzyć instancję w języku Java przesłonięcie 0, 1 lub więcej wartości domyślnych bez konieczności podawania wszystkich, rozważ rozszerzenie interfejsu API Scala, tak aby zawierał Builder w obiekcie towarzyszącym.

case class Foo(
    a: String = "a", 
    b: String = "b", 
    c: String = "c") 

object Foo { 
    class Builder { 
    var a: String = "a" 
    var b: String = "b" 
    var c: String = "c" 
    def withA(x: String) = { a = x; this } 
    def withB(x: String) = { b = x; this } 
    def withC(x: String) = { c = x; this } 
    def build = Foo(a, b, c) 
    } 
} 
Powiązane problemy