2016-09-08 7 views
5

У меня есть некоторые вложенные классы case, а для определенного механизма сериализации мне нужно предоставить productPrefix, который содержит $ символов. Как такОтключить ложное предупреждение «возможный отсутствующий интерполятор»

object Foo { 
    case class Bar() { 
    override def productPrefix = "Foo$Bar" 
    } 
} 

Теперь я получаю предупреждение компилятора от этого:

Warning:(53, 42) possible missing interpolator: detected interpolated identifier `$Bar` 
    override def productPrefix: String = "Foo$Bar" 

Есть ли способ отключить предупреждение, если это возможно только для этого экземпляра? Версия Scala - 2.11.8.


Edit: Я просто думал, что я был умным: "Foo\u0024Bar". Но компилятор даже предупреждает об этом. Другим решением является classOf[Bar].getName, учитывая ограничение отсутствия внешних объектов.

+0

'-Xlint: -использование-интерполятор, _' –

+0

@ som-snytt Ах! Правильно, у меня не было включено -Xlint для моего другого проекта (который заполнен этими строками), поэтому я был удивлен, увидев предупреждение в первый раз. В этом новом проекте я включил '-Xlint'. –

ответ

7

Если есть способ составить строку из ее частей, вы можете сделать что-то вроде этого.

override def productPrefix = "Foo$" + "Bar" 

Вы также могли бы успокоить «отсутствует интерполятора» предупреждение, фактически вызывая интерпол, но уйти от $.

override def productPrefix = f"Foo$$Bar" 
+0

Ваш другой ответ был довольно умным. –

+0

@ som-snytt, мне пришлось немного переосмыслить его. Я включил его в этот ответ. – jwvh

+0

Но это неправильно. См. Мой ответ о $$. Я имел в виду, что '' Foo $ Bar'' работает, потому что у панели объектов есть toString = "Bar". –

4

-Xlint предупреждает, если он видит вар в объеме:

$ scala -Xlint 
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101). 
Type in expressions for evaluation. Or try :help. 

scala> { val x = "hi" ; s"$x" } 
res0: String = hi 

scala> { val x = "hi" ; "$x" } 
<console>:12: warning: possible missing interpolator: detected interpolated identifier `$x` 
     { val x = "hi" ; "$x" } 
         ^
res1: String = $x 

scala> { val y = "hi" ; "$x" } // no warning if x is not a symbol 
res2: String = $x 

scala> object Foo { case class Bar() { override def productPrefix = "Foo$Bar" } } 
<console>:11: warning: possible missing interpolator: detected interpolated identifier `$Bar` 
     object Foo { case class Bar() { override def productPrefix = "Foo$Bar" } } 
                    ^
defined object Foo 

Обычно используют двойной доллар для буквального доллара, когда интерполирования. (Edit: быть ясно, $$, как \$.)

scala> object Foo { case class Bar() { override def productPrefix = s"Foo$$Bar" } } 
defined object Foo 

scala> Foo.Bar().productPrefix 
res8: String = Foo$Bar 

Используйте F-интерполятор, чтобы получить постоянную строку.

scala> def productPrefix = f"Foo$$Bar" 
productPrefix: String 

scala> :javap -pv - 
[snip] 
    public java.lang.String productPrefix(); 
    descriptor:()Ljava/lang/String; 
    flags: ACC_PUBLIC 
    Code: 
     stack=1, locals=1, args_size=1 
     0: ldc   #16     // String Foo$Bar 
     2: areturn 

Вы также можете поместить свои напуганные константы в изолированном объеме:

scala> :pa -raw 
// Entering paste mode (ctrl-D to finish) 

package k { 
trait K { final val p = "Foo$Bar" } 
} 
package q { 
    case class Bar() { override def productPrefix = (null: k.K).p } 
} 

// Exiting paste mode, now interpreting. 


scala> q.Bar().productPrefix 
res1: String = Foo$Bar 

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

5

Предупреждение вызвано -Xlint. Конкретная ЛИНТЕР о якобы отсутствующей интерпол можно отключить с помощью опции scalac командной строки, как

-Xlint:_,-missing-interpolator 

подчеркивание (_) для «все» и -missing-interpolator для «кроме отсутствующего предупреждения интерпол».