2014-12-02 13 views
8

in corso il seguente codice in una console scala interattivoScala permettendo chiamata al java.util.HashMap ottenere il metodo con il numero sbagliato di parametri

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") 

restituisce il seguente

Test 5 null null null 

mi si aspetterebbe questo codice per generare un errore del compilatore sul numero errato di parametri nella chiamata al metodo get in tutti tranne la prima chiamata. Perché questo è riuscito a compilare e restituire semplicemente null?

risposta

12

Java mappa non è di tipo sicuro, in particolare il metodo get ha questa firma:

public V get(Object key); 

in modo da poter usare qualcosa come una chiave. In Scala si sta vedendo cosiddetta auto-tupling, qualcosa che è deprecato in Scala 2.11, quindi se si compila il progetto con -deprecation, si vedrà:

[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]           ^

È possibile trasformarla in un errore con il -Xfuture flag di compilazione:

[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 significa map.get() saranno trattati come map.get(()) e map.get("key1", "key2") sarà trattata come map.get(("key1", "key2")).

Si consiglia di utilizzare i tipi di raccolta di Scala, a meno che non si abbia una ragione molto particolare per non farlo.

+3

'-Xfuture' sembra avvisare solo per i paren vuoti,' -Ywarn-adapt-args' avverte sugli altri casi di auto-tupling. – Dimitri

Problemi correlati