【问题标题】:Java Enum Value represent java.lang classJava Enum 值代表 java.lang 类
【发布时间】:2016-03-12 02:25:43
【问题描述】:

我正在尝试创建一个程序来创建它自己的小型数据库类型的东西(只是因为我想要一些额外的东西来为它做)并且我遇到了一个小事故。当我尝试为表的值设置值时,我显然必须检查它是否是正确的类型。在我的Value 类中,我有setValue 函数:

public void setValue(Object value){
    ValueType t = getColumn().getType();
    if(value instanceof t){
        // Is the correct type.
    }
    this.value = value;
}

其中ValueType 是可用值类型的枚举。这是课程:

public enum ValueType {

    STRING, INTEGER, BOOLEAN, FLOAT

}

这样直到下一行:

if(value instanceof t){

IntellIJ Idea 说t 是一个未知类。所以我试图让t 代表StringInteger。感谢您的宝贵时间和帮助。

【问题讨论】:

    标签: java class enums instanceof


    【解决方案1】:

    您可以将以下方法添加到您的枚举中:

    public enum ValueType {
        STRING, INTEGER, BOOLEAN, FLOAT;
    
        public boolean isInstance(Object obj) {
            // Generate a class name from enum name
            String className = "java.lang."+name().substring(0, 1)+
                                   name().substring(1).toLowerCase(Locale.ENGLISH);
            try {
                // Try to resolve this class and check the supplied object type
                return Class.forName(className).isInstance(obj);
            } catch (ClassNotFoundException e) {
                return false;
            }
        }
    }
    

    现在你可以写if(t.isInstance(value))了。

    不过我建议将Class 对象存储在枚举中,如下所示:

    public enum ValueType {
        STRING(String.class), INTEGER(Integer.class), BOOLEAN(Boolean.class), FLOAT(Float.class);
    
        private Class<?> clazz;
    
        ValueType(Class<?> clazz) {
            this.clazz = clazz;
        }
    
        public boolean isInstance(Object obj) {
            return clazz.isInstance(obj);
        }
    }
    

    【讨论】:

    • 如果可能的话,我会考虑使用泛型。那么你甚至不需要枚举。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多