是否可以使用仅允许基于键的值类型的映射?

sta*_*ext 5 java

我知道这听起来有点疯狂,但在这里.我有一个代表一组不同属性的枚举类型.每个都可能只是一个字符串,但强制执行某种类型的安全性会很好.因此,基本上检查与每个枚举值关联的类型,如果不匹配则抛出异常.我想这可以通过实例来完成,但我很好奇是否有另一种方法可以在没有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);
    }
}
Run Code Online (Sandbox Code Playgroud)

后来我希望这发生:

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() );
Run Code Online (Sandbox Code Playgroud)

use*_*300 1

查看 Josh Bloch 的《Effective Java》第 29 条,其中他描述了一种“类型安全的异构容器”,他将其称为“Favorites”。API 是

public class Favorites {
   public <T> void putFavorite(Class<T> type, T instance);
   public <T> T getFavorite(Class<T> type);
}
Run Code Online (Sandbox Code Playgroud)

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

favorite.putFavorite(Name.getClass(), "Fred");
favorite.putFavorite(ADate.getClass(), new Date(1234));
Run Code Online (Sandbox Code Playgroud)

然后

Date date = favorite.getFavorite(ADate.getClass());
Run Code Online (Sandbox Code Playgroud)

  • ps 请注意,在此代码中,每种类型只能有 **一个** 键值对,因为类是键。这可以吗? (3认同)