gpt4 book ai didi

java - 如何防止 Element 变成 Element
转载 作者:太空宇宙 更新时间:2023-11-04 09:33:19 27 4
gpt4 key购买 nike

为了与某些硬件同步,我创建了一个包含通用类的数据模型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/

27 4 0