3 ms·
So they are there, but ugly to define: public abstract sealed class Vehicle permits Car, Truck { public Vehicle() {} } public final class Tr
by cies 1y ago
So they are there, but ugly to define:
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
- weksf54 1y agoYou could use Java records to make things more concise: record Truck(int loadCapacity) implements Vehicle {} record Car(int numberOfSeats, String brandName) implements Vehicle {} sealed interface Vehicle permits Car, Truck {}
- vips7L 1y agoYou implemented this much more verbosely than needed sealed interface Vehicle { record Truck(int loadCapacity) implements Vehicle {} record Car(int numberOfSeats, String brandName) implements Vehicle {} }
- weksf54 1y agoAh! Thanks, I didn't know that. I should have RTFMD better - https://docs.oracle.com/en/java/javase/21/language/sealed-classes-and-interfaces.html https://docs.oracle.com/en/java/javase/21/language/sealed-cl... Turns out you can do this and not have the annoying inner class e.g. Vehicle.Car too: package com.example.vehicles; public sealed interface Vehicle // The permits clause has been omitted // as its permitted classes have been // defined in the same file. { } record Truck(int loadCapacity) implements Vehicle {} record Car(int numberOfSeats, String brandName) implements Vehicle {}
- Tainnor 1y agoScala 3 has: enum Vehicle: case Truck(loadCapacity: Int) case Car(numberOfSets: Int, brandName: String)