Comment by tonyedgecombe

4 months ago

Does Java have sum types now?

Yes via sealed classes. It also has pattern matching.

  • 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

    • You 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 {}

    • Scala 3 has:

        enum Vehicle:
          case Truck(loadCapacity: Int)
          case Car(numberOfSets: Int, brandName: String)

    • You implemented this much more verbosely than needed

          sealed interface Vehicle {
              record Truck(int loadCapacity) implements Vehicle {}
              record Car(int numberOfSeats, String brandName) implements Vehicle {}
          }

      1 reply →