2014-02-05 3 views
1

Я (упрощенный от фактического кода):Могу ли я подавить непроверенное предупреждение в этом случае?

class Def[T] 

object Fun { 
    def unapply[A,B](d: Def[A => B]): Option[A => B] = ??? 
} 

def isFun(d: Def[_]) = d match { 
    case Fun(f) => true 
    case _ => false 
} 

Это дает предупреждение:

без переменной аргумент типа А => В в тип рисунка TypeName.this.Def [А => B] снят, так как она удаляется стиранием

Я попытался размещения @unchecked после Fun(f), но это приводит к ошибке; и после f, который не подавляет предупреждение. Есть ли способ удалить это предупреждение?

+0

Подробнее код. Это Скала. Можно написать что-то, что составляет менее 30 строк кода, компилируется и запускается! : D. – goroncy

ответ

1

Надеюсь, что я ошибаюсь, но после просмотра SLS, я не верю, что вы можете применить аннотацию в нужном месте без изменения кода.

С аннотациями «могут применяться к определениям или заявлений, типов или выражений» (Глава 11), вам нужен один из тех, для применения аннотаций синтаксически правильно. Два наиболее вероятных кандидата здесь кажутся либо типом, либо выражением. Однако, глядя на Глава 8 Pattern Matching, кажется

Fun(f) 

т.е. заявление, где нужно применить аннотацию, не является ни, так как она выглядит, как это соответствует:

StableId '(' varid ')' 

ни один из которых, похоже, не соответствует биту для выражения или типа (или любой другой допустимой цели аннотации).

0

Во-первых, вы можете сменить подпись def isFun(d: Def[_]) на номер def isFun[A,B](d: Def[A=>B])?

Если нет, проблема заключается в стирании типа. На JVM, вы не можете иметь этот код:

trait Foo { 
    def doStuff(xs:List[Int]) 
    def doStuff(xs:List[Long]) 
} 

В настоящее время выполнения, не имеют информацию о дженериков, их тип стирается.

Итак, в вашем случае проблема заключается в том, что вы не можете сопоставить шаблон с общим.

Давайте посмотрим, что пример в Scala Worksheet:

object Fun { 
    def unapply[A, B](xs: List[Int]): Option[Int] = Some(1) 
} 

def isFun(d: List[_]) = d match { 
    case Fun(f) => true 
    case _ => false 
} 
//> isFun: (d: List[_])Boolean 

isFun(List(1.3)) 
//> res0: Boolean = true 

Родовой тип, который мы хотели использовать сопоставление с образцом был Int, но он сделал работу с поплавком.

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

+0

С моим фактическим кодом в unapply, я знаю, что аргумент типа является 'A => B'. –

+0

Это не проблема. Проблема заключается в сопоставлении шаблонов в isFun(). Там вы передаете 'Def [_]', и вы не знаете, что такое '_'. Итак, из-за стирания типа невозможно выполнить какое-либо сопоставление шаблонов во время выполнения родового.Вот почему в моем примере, хотя я прошел «Список [Float]», он получил соответствие «List [Int]». – n1r3

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