从列表中选择一种类型

时间:2014-01-10 21:59:54

标签: java inheritance enums

我有多个类都继承自同一个Block类,并希望根据变量值实例化其中一个类。

以下是我现在所做的事情:

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;
    }
};

然后,我尝试在给定一些数据的情况下实例化它们:

    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
    }

但是Eclipse向我显示了一个错误,说它无法将blockType解析为某种类型(鉴于java还不知道该类型,这似乎是合乎逻辑的。)

我怎样才能实现我的目标?

2 个答案:

答案 0 :(得分:3)

你不应该需要反思来做到这一点。请考虑一下:

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令牌,则应在评论中将其标记为Class<? extends Block>Elliott Frisch points out。然后拨打blockType.getConstructor().newInstance()GGrec's answer demonstrates,将返回Block的实例。

答案 1 :(得分:2)

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

模式:

Class.forName(className).getConstructor().newInstance();

你的案子:

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