首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止Element<Integer>成为Element<Object>

如何防止Element<Integer>成为Element<Object>
EN

Stack Overflow用户
提问于 2019-06-30 01:17:00
回答 1查看 28关注 0票数 1

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

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

以下是我的代码:

代码语言:javascript
复制
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
}

下面是我想说的代码示例:

代码语言:javascript
复制
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#来将值presetMy到一个特定的类型。

感谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-02 21:26:26

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

代码语言:javascript
复制
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);
        }
    }

感谢你的帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56819415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档