public class Main {

    public static <T extends SomeObject> T getObjectByType(SomeType someType, String subType) {
        return (T) switch (someType) {
            case SHAPES -> switch (ShapeSubType.valueOf(subType)) {
                case CIRCLE -> new CircleObject();
                case RECTANGLE -> new RectangleObject();
            };
            case COLORS -> switch (ColorSubType.valueOf(subType)) {
                case GREEN -> new GreenObject();
                case RED -> new RedObject();
            };
        };
    }

    public enum SomeType {
        SHAPES,
        COLORS
    }

    public enum ShapeSubType {
        CIRCLE,
        RECTANGLE
    }

    public enum ColorSubType {
        GREEN,
        RED
    }

    public static abstract class SomeObject {
    }

    public static abstract class ShapeObject extends SomeObject {
    }

    public static abstract class ColorObject extends SomeObject {
    }

    public static class CircleObject extends ShapeObject {
    }

    public static class RectangleObject extends ShapeObject {
    }

    public static class GreenObject extends ColorObject {
    }

    public static class RedObject extends ColorObject {
    }
}