2014-11-20 15 views
6

Scala wydaje się zachowywać jak Java, jeśli chodzi o magicznej przemiany prymitywów:Jak wyłączyć wszystkie niejawne konwersje typów pierwotnych?

val a: Int = 1 
val b: Double = 2.3 
println(a + b) // 3.3 
println(Math.max(a, b)) // 2.3 

Częściej niż nie, to był źródłem błędów w kodzie. Czy istnieje sposób, aby wyłączyć te niejawne konwersje, aby mój przykład dał ostrzeżenie/błąd kompilacji? Naprawdę wolałbym napisać

print(a.toDouble + b) 
println(Math.max(a.toDouble, b)) 

za każdym razem, gdy potrzebuję takich konwersji.

Odpowiedz

5

Użyj WartRemover. Taka brodawka nie jest wbudowana, ale można ją zapisać (zobacz "Pisanie reguł brodawki" w README). Chociaż teraz myślę, że to chyba więcej pracy niż początkowo sądziłem.

scalac ma również -Ywarn-numeric-widen opcję (wspólnie z -Xfatal-warnings aby wyłączyć ostrzeżenia do błędów), ale nie wiem, czy są jakieś przypadki nie objęte nim.

+2

Możesz także chcieć wyłączyć opcję '-Yno-predef' dla niektórych implicite. Bardziej ogólnie, zobacz http://tpolecat.github.io/2014/04/11/scalac-flags.html – lmm

+0

Dziękuję wam obu. Ten artykuł na temat flag-skalaków jest złoty <3 – OlivierBlanvillain

Powiązane problemy