2013-07-21 2 views
0

Я следую учебному пособию в школе Scala, и у меня возникла проблема. В разделе для неявных представлений в расширенных типах here указано, что методы могут запрашивать определенные типы доказательств для типа.Неявный параметр вида

В нем перечислены три из этих видов доказательств -

A =:= B A must be equal to B 
A <:< B A must be a subtype of B 
A <%< B A must be viewable as B 

Однако код я пишу синтаксическую ошибку, когда я пытаюсь третий вид.

Это мой код

class ContainerTwo[A](value : A) { 
    // A must be a subtype of Int 
    def addIt(implicit evidence : A <:< Int) = 123 + value 
    // A must be a viewable as a String 
    def printIt(implicit evidence : A <%< String) = println(evidence) // This line reports an error at <%< - "Cannot resolve symbol <%<" 
    // A must be a subtype of a String 
    def doSomethingWithAString(implicit evidence : A <:< String) = println(evidence) 

}

Я использую Scala 2.10. Я не уверен, что я делаю что-то неправильно, учебник ошибочен, или если Scala изменилась с момента написания учебника.

+0

Пожалуйста, всегда указывайте * актуальную * ошибку, не просто кратко описывайте ее как «сообщает о синтаксической ошибке». –

ответ

4

<%< был устаревшим и предположительно удалялся, поэтому вы видите ошибку (это не синтаксическая ошибка). Вы можете достичь того же с помощью =>, потому что точка зрения по существу неявной функции экземпляра:

def printIt(implicit evidence : A => String) = println(evidence(value)) 

Обратите внимание, что поскольку println принимает аргумент типа Any, функция, вероятно, не будут применяться, если не делать это явно , Если вы использовали метод, который требовал String, тогда компилятор будет искать неявный.

+0

Спасибо. println() был для меня просто заполнитель, я не планировал ничего с этим делать. – Ren

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