fuzion
fuzion copied to clipboard
Improvement for using map
constraint for argument missing we should catch this error earlier at compiler time.
the missing constraint is for first argument of put (java.lang.Comparable)
fuzion code
java_map := Java.java.util.TreeMap_static.new
_ := java_map.put (Java.java.lang.__jString.new "str") (Java.java.lang.__jString.new "str2")
_ := java_map.put (Java.java.lang.__jString.new "str2").lines (Java.java.lang.__jString.new "str2")
say java_map.toString
error encountered
khalil@khalil-TUXEDO-Aura-15-Gen2:~/Downloads/fuzion-idioms$ fz -modules=java.base ./src/ex.fz
error 1: FATAL FAULT `*** panic ***`: class java.util.stream.ReferencePipeline$Head cannot be cast to class java.lang.Comparable (java.util.stream.ReferencePipeline$Head and java.lang.Comparable are in module java.base of loader 'bootstrap')
Call stack:
fuzion.sys.fatal_fault#2
fuzion.type.runtime.type.fault.type.install_default.λ.call#1
fuzion.runtime.fault.cause#1
panic.type.install_default.λ.call#1
panic.cause#1
panic#1
Java.java.util.TreeMap.put_Ljava_7_lang_7_Object_s_Ljava_7_lang_7_Object_s_#2
Java.java.util.TreeMap.put#2
ex172
*** fatal errors encountered, stopping.
one error.
Here is a smaller example
m := Java.java.util.TreeMap_static.new
o := Java.java.lang.Object.new
_ := m.put o o
that produces
> ./build/bin/fz -modules=java.base ex3651.fz
error 1: FATAL FAULT `*** panic ***`: class java.lang.Object cannot be cast to class java.lang.Comparable (java.lang.Object and java.lang.Comparable are in module java.base of loader 'bootstrap')
This is IMHO not a bug, but even corresponding Java code fails:
class ex3651
{
public static void main(String[] args)
{
var m = new java.util.TreeMap();
m.put(new Object(), new Object());
}
}
produces
> java ex3651.java
ex3651.java:6: Warnung: [unchecked] Nicht geprüfter Aufruf von put(K,V) als Mitglied des Raw-Typs TreeMap
m.put(new Object(), new Object());
^
Dabei sind K,V Typvariablen:
K erweitert Object, deklariert in Klasse TreeMap
V erweitert Object, deklariert in Klasse TreeMap
1 Warnung
Exception in thread "main" java.lang.ClassCastException: class java.lang.Object cannot be cast to class java.lang.Comparable (java.lang.Object and java.lang.Comparable are in module java.base of loader 'bootstrap')
at java.base/java.util.TreeMap.compare(TreeMap.java:1604)
at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:811)
at java.base/java.util.TreeMap.put(TreeMap.java:820)
at java.base/java.util.TreeMap.put(TreeMap.java:569)
at ex3651.main(ex3651.java:6)
I will change this to an enhancement for fzjava, but I am unsure if we can ever do this.
Oh okay, so there is no constraint on key K, even in Java. Then we probably can not do anything about.