class TypedVehicle {
    public String description() {
        return "vehicle";
    }
}

class TypedCar extends TypedVehicle {
    @Override
    public String description() {
        return "car";
    }

    public int doors() {
        return 4;
    }
}

class TypedBike extends TypedVehicle {
    @Override
    public String description() {
        return "bike";
    }
}

public class DemoTypes {
    public static void main(String[] args) {
        TypedVehicle vehicle = new TypedCar();
        System.out.println(vehicle.description());
        if (vehicle instanceof TypedCar car) {
            System.out.println("doors: " + car.doors());
        }

        vehicle = new TypedBike();
        System.out.println(vehicle.description());
        System.out.println(vehicle instanceof TypedCar);

        TypedVehicle absent = null;
        System.out.println(absent instanceof TypedCar);
        try {
            TypedCar wrong = (TypedCar) vehicle;
            System.out.println(wrong.doors());
        } catch (ClassCastException error) {
            System.out.println("invalid cast");
        }
    }
}
