public abstract sealed class Vehicle permits Car, Truck {
public Vehicle() {}
}
public final class Truck extends Vehicle implements Service {
public final int loadCapacity;
public Truck(int loadCapacity) {
this.loadCapacity = loadCapacity;
}
}
public non-sealed class Car extends Vehicle implements Service {
public final int numberOfSeats;
public final String brandName;
public Car(int numberOfSeats, String brandName) {
this.numberOfSeats = numberOfSeats;
this.brandName = brandName;
}
}
In Kotlin it's a bit better, but nothing beats the ML-like langs (and Rust/ReScript/etc):
type Truck = { loadCapacity: int }
type Car = { numberOfSeats: int, brandName: string }
type Vehicle = Truck | Car
Yes via sealed classes. It also has pattern matching.
So they are there, but ugly to define:
In Kotlin it's a bit better, but nothing beats the ML-like langs (and Rust/ReScript/etc):
You could use Java records to make things more concise:
Scala 3 has:
You implemented this much more verbosely than needed
1 reply →
I think Java 21 does. Scala and Kotlin do as well.