java - 如何防止 Element<Integer> 变成 Element<Object>

标签 java android generics types

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

现在发现,如果我将数据字段存储到数据字段中,则可以在数据字段中保存字符串。 有什么办法可以防止这种情况发生吗?

这是我的代码:

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 但我不喜欢两次过度上课 我的另一个想法是使用像 C# 这样的默认(T)函数将 My Value 预设为特定类型。

感谢帮助

最佳答案

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

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);
        }
    }

感谢帮助

关于java - 如何防止 Element<Integer> 变成 Element<Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56819415/

相关文章:

java - 如何解决java.lang对象多态性的Gson反序列化问题

android - 如何在 firebase 中编写两个查询?

android - 保存路径(不在街道中) - Google API

java - 编译器对泛型方法的空参数的行为不同

c# - 如何向下转换通用类型的实例?

java - 子页面的不同 CSS 文件

java - java 2d游戏中的碰撞检测

java - Selenium Webdriver 在打开的 Firefox 中失败

android - 服务接口(interface)

JAVA GENERICS ERROR : have the same erasure, 但两者都没有覆盖另一个