Как в Scala определить объект-компаньон для класса, определенного в Java?

Я хотел бы добавить неявные преобразования в классы Java, созданные инструментом моделирования. Поэтому я хочу добавить их в сопутствующий объект этих классов, чтобы компилятор автоматически находил их. Но я не могу добавить их в отдельный файл, потому что компаньон должен быть определен в этом же файле. Могу ли я что-нибудь с этим сделать?

Конечно, я могу определить все свои неявные преобразования в другом объекте, а затем включить их в область видимости, но для этого потребуется дополнительный импорт. Любое другое решение?


person Jean-Philippe Pellet    schedule 07.02.2011    source источник
comment
Вы можете определить неявные преобразования в объекте пакета, избегая дополнительного импорта.   -  person axel22    schedule 07.02.2011
comment
Классы Java не имеют сопутствующего объекта. Вы имеете в виду, что пытаетесь обмануть и создать впечатление, что у класса Java есть объект-компаньон?   -  person Rex Kerr    schedule 07.02.2011
comment
@Rex Kerr: Да, ну, я не знал, что это считается мошенничеством. @axel22: Хорошая идея, думаю, я продолжу!   -  person Jean-Philippe Pellet    schedule 07.02.2011
comment
На самом деле я хотел бы задать аналогичный вопрос, когда цель состоит в том, чтобы написать экстрактор шаблонов (unapply) для класса Java без использования другого имени для объекта.   -  person Ken Bloom    schedule 07.02.2011


Ответы (2)


С компилятором Scala в его нынешнем виде нет другого способа определить сопутствующие объекты, кроме как поместить их в один и тот же файл. Лучшее, что вы можете сделать, это не сопутствующий объект с тем же пакетом и именем и дополнительным импортом.

Если вы можете придумать хороший способ создать апостериорное общение, не нарушая предположений об инкапсуляции, опубликуйте сообщение на http://groups.google.com/group/scala-debate, потому что это явно была бы очень полезная функция.

person James Iry    schedule 07.02.2011

Конечно, вы можете определить свой собственный объект-компаньон, что я часто делаю в своем собственном проекте, похожем на Predef. Например:

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
  }

Затем это можно использовать:

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

Но ваш domain.TimeUnit - это модуль (т.е. scala object)

person oxbow_lakes    schedule 07.02.2011
comment
Это был бы отдельный объект, а не объект-компаньон, не так ли? (конечный результат здесь тот же) - person VonC; 07.02.2011
comment
это, по крайней мере, не будет работать для неявных преобразований (которые являются приятным местом для сопутствующих объектов) - person Vasil Remeniuk; 07.02.2011
comment
Это правда, но это все еще самостоятельный объект, и его можно передавать - person oxbow_lakes; 07.02.2011
comment
Это не сопутствующий объект. - person James Iry; 07.02.2011
comment
Вы никогда не сможете получить настоящий объект-компаньон, потому что настоящий объект-компаньон имеет доступ к закрытым членам класса, которому он соответствует. - person Ken Bloom; 07.02.2011