C/C++ structs(classes) on the other hand represents a memory layout so an array of "objects" would be laid out as a single contigious block of memory. (and this works well for a GPU)
There is/was a propsal for Java for value types but it hasn't yet been approved. https://openjdk.java.net/jeps/169
(As a side note, C# classes are used as refernces like in Java but they also have "struct" in C# that behaves like C structs, and this is what the Unity boost compiler leverages and could be used for a GPU variant with less restrictions)
Grated it isn't perfect, hence the value types proposal.
Here is one of the CUDA commercial offerings for Java and .NET,
Only if escape analysis says it didn't go anywhere. Which works for iterators but it's not going to work for input & output arrays to this system, especially since it's asynchronous meaning it did escape the stack frame.
It is also possible to do native memory allocation in Java.
Imposing restrictions on a Java subset is hardly any different of imposing restrictions on C and C++, which apparently is ok to do.