gpt4 book ai didi

java - 是否可以有一个只允许基于键的值类型的映射?

转载 作者:搜寻专家 更新时间:2023-10-31 20:30:23 24 4
gpt4 key购买 nike

我知道这听起来有点疯狂,但就是这样。我有一个代表一堆不同属性的枚举类型。每个都可以只是一个字符串,但强制执行某种类型安全会很好。所以基本上检查与每个枚举值关联的类型,如果不匹配则抛出异常。我想这可以用 instance of 来完成,但我很好奇是否有另一种方法可以在没有 instanceof 的情况下做到这一点。我知道这可能是不可能的,但我很好奇。

编辑,我创建了一个新示例,我认为它更好地说明了我的要求:

public class CmisProperties {

public enum CmisPropEnum{
Name (PropertyIds.NAME, new String() ),
CreatedBy (PropertyIds.CREATED_BY, new String() ),
CreationDate (PropertyIds.CREATION_DATE, new Date() ),
LastModifiedBy (PropertyIds.LAST_MODIFIED_BY, new String() ),
LastModificationDate (PropertyIds.LAST_MODIFICATION_DATE, new Date() ),
ChangeToken (PropertyIds.CHANGE_TOKEN, new String() );

private String propId;

CmisPropEnum ( String propId , Object templateObject ){
this.propId = propId;
}

public <T> String getPropId(){
return propId;
}
}

private Map<CmisPropEnum, Object> propertyMap = new HashMap<CmisPropEnum, Object>();

public Object getProperty(CmisPropEnum propEnum){
return propertyMap.get(propEnum.getPropId());
}

public void setProperty( CmisPropEnum propEnum, Object value){
propertyMap.put(propEnum, value);
}
}

稍后我希望这发生:

CmisProperties props = new CmisProperties();
/* This causes a compile time exception */
props.setProperty(CmisPropEnum.CreationDate, "foobar" );
/* This I want to be ok, because the type matches that in the enum */
props.setProperty(CmisPropEnum.CreationDate, new Date() );

最佳答案

查看 Josh Bloch 的 Effective Java,第 29 项,他在其中描述了一个他称之为“Collection 夹”的“类型安全异构容器”。 API是

public class Favorites {
public <T> void putFavorite(Class<T> type, T instance);
public <T> T getFavorite(Class<T> type);
}

我认为它会满足您的需求(可能会更改名称???)。你可以打电话

favorite.putFavorite(Name.getClass(), "Fred");
favorite.putFavorite(ADate.getClass(), new Date(1234));

以后

Date date = favorite.getFavorite(ADate.getClass());

关于java - 是否可以有一个只允许基于键的值类型的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8130053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com