Java 从列表中选择一种类型

Java 从列表中选择一种类型,java,inheritance,enums,Java,Inheritance,Enums,我有多个类,它们都继承自同一个块类,并希望基于变量值实例化其中一个类 以下是我现在所做的: public enum MapCases { FLOOR (Floor.class), // These are all subclass of my Block class WALL (Wall.class), ROCK (Rock.class); private Class<?> blockType; MapCases (Class<?&g

我有多个类,它们都继承自同一个
类,并希望基于变量值实例化其中一个类

以下是我现在所做的:

public enum MapCases {
    FLOOR (Floor.class), // These are all subclass of my Block class
    WALL (Wall.class),
    ROCK (Rock.class);

    private Class<?> blockType;

    MapCases (Class<?> pointing) {
        this.block = pointing;
    }

    public Class<?> getType () {
        return this.blockType;
    }
};
公共枚举映射案例{
FLOOR(FLOOR.class),//这些都是我的Block类的子类
墙(墙类),
岩石(岩石类);
私有类块类型;
MapCases(类定点){
这个.block=指向;
}
公共类getType(){
返回此.blockType;
}
};
然后,我尝试在给定一些数据的情况下实例化它们:

    private Block[] blocks; // Array of the mother type
    ...
    blocks = new Block[data.length]; // data is an int array
    for (int i = 0; i < data.length; i++) {
        int choice = data[i];
        Class<?> blockType = MapCases.values()[choice].getType();
        blocks[i] = new blockType(); // blockType is of unresolved type
    }
private Block[]块;//母类型的数组
...
blocks=新块[data.length];//数据是一个整数数组
对于(int i=0;i
但是Eclipse向我显示了一个错误,它无法将blockType解析为一个类型(考虑到java还不知道该类型,这似乎是合乎逻辑的)


我如何才能实现我要做的事情?

使用反射从类蓝图创建一个新实例

模式:

Class.forName(className).getConstructor().newInstance();
你的情况:

blocks[i] = blockType.getConstructor().newInstance();

使用反射从类蓝图创建新实例

模式:

Class.forName(className).getConstructor().newInstance();
你的情况:

blocks[i] = blockType.getConstructor().newInstance();

这样做不需要思考。考虑这个问题:

public enum MapCases {
    FLOOR {
        @Override
        public Block makeBlock() {
            return new Floor();
        }
    },
    WALL {
        @Override
        public Block makeBlock() {
            return new Wall();
        }
    },
    ROCK {
        @Override
        public Block makeBlock() {
            return new Rock();
        }
    };

    public abstract Block makeBlock();
}
在本例中,枚举本身充当工厂,而不是它所持有的
标记



请注意,如果您确实希望坚持使用
Class
标记,则应将其键入
Class,这样做不需要反射。考虑这个问题:

public enum MapCases {
    FLOOR {
        @Override
        public Block makeBlock() {
            return new Floor();
        }
    },
    WALL {
        @Override
        public Block makeBlock() {
            return new Wall();
        }
    },
    ROCK {
        @Override
        public Block makeBlock() {
            return new Rock();
        }
    };

    public abstract Block makeBlock();
}
在本例中,枚举本身充当工厂,而不是它所持有的
标记



请注意,如果您确实想继续使用
Class
标记,则应将其键入
ClassTry
?扩展块
。我不知道这类事情是可能的。但是它不起作用,类型仍然无法解析。是否尝试
?扩展块
。我不知道这类事情是可能的。但是它不起作用,类型仍然没有解析。它看起来更好,但是Eclipse仍然看到一个错误,并告诉我使用try-catch来处理各种实例化异常。我假设它需要一个精确的类型,不像我做的那个样。所有的反射机制都需要检查异常处理。所以捕获它们是可以的,看起来更好,但Eclipse仍然看到一个错误,并告诉我使用try-catch来处理各种实例化异常。我假设它需要一个精确的类型,不像我做的那个样。所有的反射机制都需要检查异常处理。所以抓住他们没关系,很有趣。这似乎是个好办法。我现在试试看,我正在用同样的东西写另一个答案。非常干净漂亮!有趣的这似乎是个好办法。我现在试试看,我正在用同样的东西写另一个答案。非常干净漂亮!