2014-12-17 43 views
7

Używam narzędzia WartRemover, aby uniknąć możliwych błędów w moim kodzie Scala 2.11.Jak naprawić typ produktu Inferred error from Scala's WartRemover tool

szczególności chcę wiedzieć, jak rozwiązać ten „typ produktu Wnioskowany błędzie.

Patrząc na dokumentacji repo, widzę tylko przykład awarii, ale chciałbym wiedzieć, jak jestem przypuszczać, aby naprawić ten błąd:

https://github.com/puffnfresh/wartremover#product.

Odrabiam zadanie domowe z tego innego linku, który wyjaśnia, w jaki sposób naprawić Niespełnienie incydentów typu błędy https://blog.cppcabrera.com/posts/scala-wart-remover.html. I cytuję "Jeśli zobaczysz którekolwiek z ostrzeżeń poniżej, poprawka jest zwykle tak prosta, jak nadawanie adnotacji typu", ale nie rozumiem, co to oznacza. Naprawdę potrzebuję konkretnego przykładu.

Odpowiedz

4

Product to bardzo abstrakcyjny typ wysokiego poziomu, z bardzo ograniczonymi ograniczeniami. Kiedy wywnioskowany typ to Product, zazwyczaj oznacza to, że popełniłeś błąd. Na przykład. jeśli masz:

List((1, "hi", 0.4f), (2, "bye"), (3, "aloha", 7.2f)) 

Wtedy będzie to skompilować ok, co daje List[Product]. Ale tak jak w przypadku, gdy Any jest wywnioskowane, jest to prawdopodobnie błąd - prawdopodobnie oznaczało to, że jest to List[(Int, String, Float)] i ma mieć trzeci wpis w środkowej krotce.

Jeśli naprawdę chcę List[Product], można uniknąć ostrzeżony o tym dając argument type wyraźnie:

List[Product]((1, "hi", 0.4f), (2, "bye"), (3, "aloha", 7.2f)) 
+0

Witam! Dziękuję za odpowiedź. Teraz rozumiem to trochę więcej. Powiedzmy, że mam to wyrażenie, że ** powinno ** być (String, JsValue): 'val name: (String, JsValue) =" name "-> teacher.name.map (JsString (_)) .getOrElse (JsNull) ' Jak jawnie powiedzieć, że wiersz I powinien być (String, JsValue)? Obecnie otrzymuję błąd "Wnioski o rodzaj produktu". BTW: JsString i JsNull odziedziczone z JsValue (spray-json lib) – mayacr86

+0

Spróbuj wstawić adnotację typu po prawej stronie wyrażenia? Jedyną rzeczą, którą mogę zasugerować, jest rozbicie linii, abyś mógł zobaczyć, która konkretna część powoduje problem. – lmm

+0

Rzeczywiście, coś innego było przyczyną problemu. Dzięki za radę! – mayacr86

1

Rodzaj adnotacji jest tylko jawnie określając rodzaj, zamiast pozostawienia go do rodzaju system wnioskowania do pracy.

Najprostszym przykładem w tym przypadku może być:

val element = 2 

Obecnie wywnioskować typ jest Int, Jeśli chcesz mieć większą kontrolę nad typem jak określić Byte, Short, Long, Double można jednoznacznie podać typ jako:

val element: Double = 2 

Rodzaj adnotacji jest również wymagane dla metod publicznych

Type inference may break encapsulation in these cases, because it depends on internal method and class details

(Source)