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来处理各种实例化异常。我假设它需要一个精确的类型,不像我做的那个样。所有的反射机制都需要检查异常处理。所以抓住他们没关系,很有趣。这似乎是个好办法。我现在试试看,我正在用同样的东西写另一个答案。非常干净漂亮!有趣的这似乎是个好办法。我现在试试看,我正在用同样的东西写另一个答案。非常干净漂亮!