2014-12-02 8 views
8

uruchamiając następujący kod w interaktywnej konsoli scalaScala umożliwiające wywołanie java.util.HashMap dostać sposób z niewłaściwej liczby parametrów

val map = new java.util.HashMap[String, Integer](); 

map.put("key1", 5) 

"Test " + map.get("key1") + " " + map.get() + " " + map.get("key1", "key2") + " " + map.get("key1", "key2", "key3") 

zwraca następujący

Test 5 null null null 

Spodziewam się tego kod powodujący błąd kompilatora dotyczący nieprawidłowej liczby parametrów w wywołaniu metody get we wszystkich oprócz pierwszego połączenia. Dlaczego ta funkcja pomyślnie kompiluje i zwraca wartość zerową?

Odpowiedz

12

mapa Java nie jest typ bezpieczne, w szczególności metoda get ma ten podpis:

public V get(Object key); 

Więc można użyć czegokolwiek jako klucz. W Scala widzisz tzw auto-tupling, coś, co jest przestarzałe w Scala 2.11, więc jeśli skompilować projekt z -deprecation, widać:

[warn] ... Adaptation of argument list by inserting() has been deprecated: leaky (Object-receiving) target makes this especially dangerous. 
[warn]   signature: HashMap.get(x$1: Any): V 
[warn] given arguments: <none> 
[warn] after adaptation: HashMap.get((): Unit) 
[warn] "Test " + map.get("key1") + " " + map.get() + " " + map.get("key1", "key2") + " " + map.get("key1", "key2", "key3") 
[warn]           ^

Można włączyć to do błędu z -Xfuture kompilator flag:

[error] ... Adaptation of argument list by inserting() has been removed. 
[error]   signature: HashMap.get(x$1: Any): V 
[error] given arguments: <none> 
[error] "Test " + map.get("key1") + " " + map.get() + " " + map.get("key1", "key2") + " " + map.get("key1", "key2", "key3") 
[error]           ^

Auto-tupling oznacza map.get() będą traktowane jako map.get(()) i map.get("key1", "key2") będą traktowane jako map.get(("key1", "key2")).

Polecam używanie własnych kolekcji kolekcji Scala, chyba że masz ku temu szczególny powód.

+3

'-Xfuture' wydaje się ostrzegać tylko o pustych parensach,' -Ywarn-fitted-args' ostrzega o innych przypadkach automatycznego tuplingu. – Dimitri

Powiązane problemy