有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何防止元素<Integer>变成元素<Object>

为了与一些硬件同步,我创建了一个包含泛型类的数据模型 用于在HashMap中存储不同类型对象的数据字段。 HashMapMyDictionary

现在我发现,如果我将一个数据字段存储到一个数据字段中,就可以在该数据字段中保存一个字符串。 有没有办法防止这种情况发生

这是我的密码:

public class DataField<T> implements IDataField<T> {
    //region Fields
    private T _value;
    private boolean _hasChanged;
    private ChildObserable<T> _hasChangedObserverable;
    //endregion

    //region Methodes
    public DataField(T val) throws IllegalValueException {
        if(val.getClass() != _value.getClass()) throw new IllegalValueException();
        _value =val;
        _hasChanged=false;
        _hasChangedObserverable=new ChildObserable<>();
    }
    public DataField(T val,Observer observer){
        _value =val;
        _hasChanged=false;
        _hasChangedObserverable=new ChildObserable<>();
        addChangeObserver(observer);
    }
    //region getters
    @Override
    public T getValue() {
        return _value;
    }

    @Override
    public boolean hasBeChanged() {
        return _hasChanged;
    }
    //endregion
    //region setters
    @Override
    public void setValue(T value) throws IllegalValueException {
        if(value.getClass()!= _value.getClass()) throw new IllegalValueException();
        if(value!=_value) {
            _value = value;
            _hasChanged=true;
            _hasChangedObserverable.sendValue(_value);
        }
    }

    @Override
    public void clearChangedState() {
        _hasChanged=false;
    }
//endregion
    //region observers
    @Override
    public void addChangeObserver(Observer observer) {
        _hasChangedObserverable.addObserver(observer);
    }

    @Override
    public void removeChangeObserver(Observer observer) {
        _hasChangedObserverable.deleteObserver(observer);
    }
    //endregion
    //endregion
}

下面是一个代码示例,我的意思是:

DataField dataField = new DataField<Integer>(5);
dataField.setValue(true); // This can be prevented because of checking Class

DataField dataField = new DataField<String>(null);
dataField.setValue(5); // This can not be prevented because of NullPointer Exception

我找到了一些类似这样的解决方案How to keep generic type of nested generics with class tokens 但是我不喜欢给学生两次过高的分数 我的另一个想法是使用默认(T)函数(如C#)将我的值预设为特定类型

谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

    我用第二个构造函数和一个类字段解决了这个问题

    public DataField(T val) throws IllegalValueException {
            if(val==null) throw  new IllegalArgumentException("Class type couldn't be resolved from null");
            _value =val;
            _class=val.getClass();
            _hasChanged=false;
            _hasChangedObserverable=new ChildObserable<>();
        }
        public DataField(T val,Class<T> classType) throws IllegalValueException {
            if(val!=null &&  val.getClass()!=classType) throw  new IllegalArgumentException("Type of val and classType are Different");
            _class=classType;
            _value=val;
            _hasChanged=false;
            _hasChangedObserverable=new ChildObserable<>();
        }
    
    
    @Override
        public void setValue(T value) throws IllegalValueException {
            if(_class!= value.getClass()) throw new IllegalValueException();
            if(value!=_value) {
                _value = value;
                _hasChanged=true;
                _hasChangedObserverable.sendValue(_value);
            }
        }
    

    谢谢你的帮助