They allude to this later, acknowledging that it’s sort of a cross between unit and bottom.
No it’s not, it is 100% a unit type (except it’s not really a type, since you can only use it as return type and nowhere else)
It’s not possible to instantiate or assign, which is more like a never type than a unit; and it is not possible to define new types with the same properties, which is also more like bottom than unit. But you’re right that it’s not actually a true never type since it can’t represent function divergence.
I think the truth is just that Java’s type system isn’t very mathematically disciplined.
It’s not possible to instantiate or assign, which is more like a never type than a unit
Actually, this is because void
is not a type, it is just a keyword, a placeholder used instead of the return type when a function doesn’t return anything.
If it were a bottom type, that would mean that a method returning void
must diverge, which is simply not true.
Also, if it were a bottom type, it would be possible to write an “unreachable” method
void unreachable(void bottom) {
return bottom;
}
Even though it couldn’t be called, it should be possible to define it, if void
was a bottom type. But it is not, because void
isn’t a bottom type, it’s no type at all.