fuzion icon indicating copy to clipboard operation
fuzion copied to clipboard

Improvement for using map

Open khalilmj13 opened this issue 1 year ago • 2 comments

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.

khalilmj13 avatar Aug 27 '24 14:08 khalilmj13

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.

fridis avatar Aug 27 '24 15:08 fridis

Oh okay, so there is no constraint on key K, even in Java. Then we probably can not do anything about.

michaellilltokiwa avatar Aug 28 '24 07:08 michaellilltokiwa