The only times the lack of unsigned types causes issues is when doing low-level binary encoding, and most programmers steer clear of that anyhow. I think it's a good tradeoff to make things simpler for most, but a bit more difficult for few.
Imagine you try to combine a 4bytes (from an array) into a single int. If you just bitwise OR and shift left, e.g. something like
(b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]
it won't work, you need ((b[1] & 0ff) << 16), etc. The byte values greater than 127 would have the sign bit set (and all other higher bits to make the 2complimentary form)That part is somewhat alleviated by wrapping byte arrays into ByteBuffers that would the right thing, or even better using only ByteBuffers (preferably the direct version of them when reading from input/output)
https://kotlinlang.org/docs/basic-types.html#unsigned-intege...
The way java is built in internally I can quite see another primitive type popping up.
Are you just objecting to the verbosity of method calls over operators? Yes it's a bit annoying, but the functionality is all there.