2015-06-22 3 views
4

Я использую библиотеку, которая имеет класс Product какпереопределить метод библиотеки с помощью Scala неявной

class Product { 
    def toString() = "Whatever" 
} 

Я хочу, чтобы переопределить этот метод toString. Таким образом, существует два решения.

1 - Скопируйте содержимое этого класса и создайте тот же новый класс в своем собственном проекте и сделайте все с помощью этого метода.
2 - Использование Scala Impilicit

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

class NewProduct(val p: Product) { 
    override def toString() = "an-other whatever" 
} 
implicit def customToString(p: Product) = new NewProduct(p) 

Теперь, если я печатаю на этом пути println((new Product()).toString) Он печатает whatever, но я ожидал an-other whatever
Кажется, что это не перекрывая этот метод, потому что если я добавить новый метод, то это работает, как ожидалось

class NewProduct(val p: Product) { 
    def NewtoString() = "an-other whatever" 
} 
implicit def customToString(p: Product) = new NewProduct(p) 

Теперь, если я печатаю на этом пути println((new Product()).NewtoString) Он печатает an-other whatever его средний новый метод NewtoString добавляется к этому классу.

Что мне не хватает? Можно ли переопределить методы, использующие неявные в Scala ??

ответ

6

Implicits используются, если компилятор scala не может найти метод без него, поэтому вы не можете переопределять методы с implicits. Используйте наследование для выполнения этих задач.

class NewProduct extends Product { 
    override def toString() = "an-other whatever" 
} 
+0

, так что я могу сделать в этой ситуации? У меня есть Jar, содержащий этот класс, теперь, что я могу сделать, чтобы переопределить этот метод? –

+1

Наследование - ключевое слово. – volia17

+0

не может написать код здесь, отредактировал мой ответ –

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