3 java enums types casting class
我有一个枚举表示特定表中的所有列值.现在我想存储一个每个枚举元素的类型,这个元素被查询以供稍后的转换.
public enum Value {
MEMBER1(?...?),
MEMBER2(?...?);
private final ?...? type;
Value(?...? type) {
this.type = type;
}
public ?...? getType() {
return type;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在不需要代替?...?.也许它MyClassA.class和Class但我如何将此值用于此操作:
MEMBER1.getType() instance = (MEMBER1.getType()) object;
Run Code Online (Sandbox Code Playgroud)
对我来说,这对于与java进行数据库通信非常重要.
更新:我的意思是这个操作.
END UPDATE:存在逻辑错误.如果我知道不同的类型,我可以简单地创建多个方法,因为我有一个api规范.
你是对的.枚举应定义如下
public enum Value {
MEMBER1(String.class),
MEMBER2(Integer.class);
private final Class<?> type;
private Value(Class<?> type) {
this.type = type;
}
public Class<?> getType(){
return this.type;
}
}
Run Code Online (Sandbox Code Playgroud)
第二部分实际上是你不想做的事情,因为你已经知道你想要将对象强制转换为什么类型(在你的情况下是MyClassA)所以你可以直接投射如下
//I know what is the target type so I don't have to fetch the type from my enum
MyClassA instance = (MyClassA) object;
Run Code Online (Sandbox Code Playgroud)
一旦你需要在未知数据类型上构建你的逻辑,你可以做类似的事情
Object o = getTheObjectSomewhere();
if(o.getClass().isAssignableFrom(MEMBER1.getType()){
String s = (String) o;
System.out.println("Target type is string!");
doSomething();
} else if (o.getClass().isAssignableFrom(MEMBER2.getType()){
Integer i = (Integer) i;
System.out.println("Target type is integer!");
doSomethingElese();
}
Run Code Online (Sandbox Code Playgroud)
也许您希望稍后根据对象的类型搜索列.然后,您可以创建一个方法来获取列
public Value getColumnByObjectType(Object o){
for(Value v : Value.values()){
if(v.getType().equals(o.getClass()){
return v;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
并使用它来搜索列
Object o = getObjectSomewhere();
Value column = getColumnByObjectType(o);
Run Code Online (Sandbox Code Playgroud)
要根据下面的注释获取用户对象,您可以执行类似以下使用JPA的操作
public Object getUserObject(int id, Value v){
TypedQuery<?> q = DBUtils.getEntityManager().createQuery("select u.:column from User u where u.id = :id",v.getType());
q.setParameter("column", v.toString());
q.setParameter("id", id);
q.setMaxResult(1);
return q.getSingleResult();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5831 次 |
| 最近记录: |