ArrayStoreException: bug or expected behavior?

Michael Hoffer info at michaelhoffer.de
Fri Jul 26 11:19:51 UTC 2019


Hi Tobias,

thanks for your quick response. You are right. I was too focused on inline types and didn’t see what actually caused the issue. So the root of the problem is that Java treats a Point2D[] array as a subtype of Point2DI[]. But that’s just wrong. This is indeed known and therefore expected behavior. Still feels broken though.

Regards,
Michael

--
Dr. Michael Hoffer

Web:    mihosoft.eu
Twitter: @mihosoft

Goethe-Zentrum für Wissenschaftliches Rechnen (G-CSC)
Goethe-Universität
Kettenhofweg 139
60325 Frankfurt am Main
phone: +49 69 798 25254
info at michaelhoffer.de

> Am 26.07.2019 um 13:06 schrieb Tobias Hartmann <tobias.hartmann at oracle.com>:
> 
> Hi Michael,
> 
> thanks for trying out inline types!
> 
> I just had a quick look at this but when removing the "inline" from Point2D and executing with
> latest Java, you get an ArrayStoreException exception as well (and no compile-time warning/error).
> 
> So if I don't miss anything, this isn't specific to inline types and therefore expected behavior.
> 
> Best regards,
> Tobias
> 
> On 26.07.19 12:36, Michael Hoffer wrote:
>> Hi all,
>> 
>> I finally found the time to play with the newest Valhalla build. We have a lot of use cases for this in the scientific community. Thanks for working on it.
>> 
>> I prepared a small test program that throws an ArrayStoreException during the assignment of an "inline value" to an array. I wanted to test the behavior of casting between "inline" and the nullable "?" type and interfaces. 
>> 
>> My expectations are that such errors should be prevented by the type system and should be discovered at compile-time. Either Point2D shouldn’t be allowed to implement the Point2DI interface (hopefully, that’s not the case) or the assignment of the points-array with an array of "inline values“ should be prevented (which is better).
>> 
>> Is this a bug or the expected behavior of the preview build?
>> 
>> Regards,
>> Michael
>> 
>> --
>> Dr. Michael Hoffer
>> 
>> Web:    mihosoft.eu
>> Twitter: @mihosoft
>> 
>> Goethe-Zentrum für Wissenschaftliches Rechnen (G-CSC)
>> Goethe-Universität
>> Kettenhofweg 139
>> 60325 Frankfurt am Main
>> phone: +49 69 798 25254
>> info at michaelhoffer.de
>> 
>> 
>> /**
>> * <p>
>> * <b>How to reproduce the behavior/potential bug:</b>  
>> * 
>> * Compile this code with <b>jdk-14-valhalla+1-8 (2019/7/4)</b>:
>> * 
>> * <pre>
>> * javac Main.java && java Main
>> * </pre>
>> * 
>> * </p>
>> * <p>
>> * <b>Actual behavior:</b> a java.lang.ArrayStoreException is thrown
>> * unexpectedly in line 33. 
>> * </p>
>> * <p>
>> * <b>Expected behavior:</b> compile-time error that prevents the problematic
>> * assignment in line 30.
>> * </p>
>> * 
>> * @author Michael Hoffer <info at michaelhoffer.de>
>> */
>> public class Main {
>>    public static void main(String[] args) {
>> 
>>        int n = 100_000_000;
>> 
>>        System.out.println("> creating " + n + " points");
>> 
>>        Point2DI[] points = new Point2D[n];
>> 
>>        for(int i = 0; i < points.length;i++) {
>>            points[i] = new Point2DCls(i, i);
>>        }
>>    }
>> 
>>    static interface Point2DI {
>>        double getX();
>>        double getY();
>>    }
>> 
>>    static inline class Point2D implements Point2DI {
>>        public double x;
>>        public double y;
>> 
>>        Point2D(double x, double y) {
>>            this.x = x;
>>            this.y = y;
>>        }
>> 
>>        @Override
>>        public double getX() {
>>            return x;
>>        }
>> 
>>        @Override
>>        public double getY() {
>>            return y;
>>        }
>>    }
>> 
>>    static class Point2DCls implements Point2DI {
>>        public double x;
>>        public double y;
>> 
>>        Point2DCls(double x, double y) {
>>            this.x = x;
>>            this.y = y;
>>        }
>> 
>>        @Override
>>        public double getX() {
>>            return x;
>>        }
>> 
>>        @Override
>>        public double getY() {
>>            return y;
>>        }
>>    }
>> } // end class Main
>> 
>> 
>> 
>> 
>> 
>> 
>> 



More information about the valhalla-dev mailing list