2014-02-13 3 views
4

У меня есть это в Скале:Используя SCALA общий класс в Java

object Tester { 
    def apply[T : Manifest](description: String, initValue: T) = new Tester[T](description, initValue) 
    implicit def TesterToValue[T](j: Tester[T]): T = j.value 
} 

class Tester[T : Manifest](someData: String, initValue: T) { 
    private var value = initValue 
    def getValue : T = value 
} 

, который позволяет мне делать

val t1 = JmxValue("some data", 4) 

Я пытаюсь создать экземпляр этого Java, до сих пор у меня не было никакой удачи я попытался:

Tester t1 = Tester<Integer>("data", 0); 
Tester<Integer> t1 = Tester<Integer>("data", 0); 
Tester t1 = Tester("data", 0); 
Tester t1 = new Tester<Integer>("data", 0); 
Tester<Integer> t1 = new Tester<Integer>("data", 0); 

есть некоторые ограничения в использовании SCALA общие классы в Java? Или я просто делаю что-то ужасно неправильно

+0

Для начала вы можете ударить по всем попыткам, которые не используют 'new'. 'Tester t1 = Tester (" data ", 0);' не является синтаксически допустимой Java ни при каких обстоятельствах (что даже не имеет никакого отношения к Scala). –

ответ

5

Ваш Tester класс на самом деле имеет неявный параметр (из-за границы в [T : Manifest] типа. Синтаксис используется сахар для

// Scala Class 
class Tester[T](someData: String, initValue: T)(implicit man: Manifest[T]){...} 

Когда это будет скомпилирован, то два аргумента списки конденсируются к одному, так что вы в конечном итоге с Java эквивалент

//Java Constructor 
public Tester(String someData, T initValue, Manifest<T> man){...} 

вы можете увидеть тип подписи, выполнив команду javap на Tester.class файл, который получает созданный компилятором scala.

Итак, если вы пытаетесь использовать класс Tester с Java, вам необходимо явно указать параметр, который обычно компилятор scala будет определять для вас.

Глядя на скаладоки, это выглядит как ManifestFactory, где вам нужно пойти, чтобы создать экземпляры манифеста. Таким образом, ваш код java будет выглядеть примерно так:

Manifest<Integer> man = ManifestFactory$.MODULE$.classType(Integer.class); 
Tester<Integer> tester = new Tester<Integer>("data", 123, man); 
+0

, так как это будет работать в моем примере Integer? –

+0

Недавно я отредактировал свой ответ. Приведенный мною пример должен ответить на этот вопрос. – Dylan

+0

Я буду верить, что это сработает, но при дальнейшем расследовании это требует последней версии scala? –

Смежные вопросы