Java 一个Hashmap,有一组有限的键,每个键只接受一种类型的值?

Java 一个Hashmap,有一组有限的键,每个键只接受一种类型的值?,java,android,hashmap,tweener,Java,Android,Hashmap,Tweener,好吧,这可能有点难以解释。我正在寻找一种构建某种Hashmap的方法,它将填充我已经知道的键(因为它们是我正在创建的对象的属性)。这些已知键中的每一个都将具有字符串、int或float(将自动装箱)的值,或者——稍后——某种对象/函数的值(我仍然不知道我将如何完成这一部分,但无论如何,这将更进一步)。我还想设置接受每个键的类型(比如键“x”只接受整数类型的值,键“equation”只接受字符串,等等) 为了提供更多的上下文,我的目标是构建一个Tweener实用程序,因为我在Java中没有发现这样

好吧,这可能有点难以解释。我正在寻找一种构建某种Hashmap的方法,它将填充我已经知道的键(因为它们是我正在创建的对象的属性)。这些已知键中的每一个都将具有字符串、int或float(将自动装箱)的值,或者——稍后——某种对象/函数的值(我仍然不知道我将如何完成这一部分,但无论如何,这将更进一步)。我还想设置接受每个键的类型(比如键“x”只接受整数类型的值,键“equation”只接受字符串,等等)


为了提供更多的上下文,我的目标是构建一个Tweener实用程序,因为我在Java中没有发现这样的库,除了SumoTween,它根本不适合我的需要。我试着用Caurina的方式来构建我的课程。如果你有一个更好的选择,可以节省我的时间和麻烦,请随意分享(关于Tweeners或关于我的Hashmap问题)。顺便说一句,我做这个Tweener是为了在我正在构建的Android游戏中使用它,以便在位图/可绘制对象上制作动画(不能为那些afaik使用动画类)


PS:这是我在这个网站上的第一个问题,我希望我不要听起来太困惑;请耐心听我说。

如果我理解正确,您基本上是在寻找哈希映射。对吗


是的,我知道用这种方式使用“Object”不是很漂亮。

如果我理解正确,你基本上是在寻找一个HashMap。对吗


是的,我知道这样使用“Object”不是很漂亮。

为什么要使用hashmap?如果您知道“键”,只需使用这些成员创建一个类,然后您就可以随意键入它们


如果出于某种原因确实必须使用hashmap,您可以扩展它并重写put()方法来检查您的魔法值。但我强烈建议不要这样做,这是一个糟糕的设计。

为什么要使用hashmap呢?如果您知道“键”,只需使用这些成员创建一个类,然后您就可以随意键入它们


如果出于某种原因确实必须使用hashmap,您可以扩展它并重写put()方法来检查您的魔法值。但我强烈建议不要这样做,因为它的设计很差。

我不完全确定这是否是您所要求的,但听起来您可以为键使用某种接口/抽象类,并为每种键类型适当地实现/扩展它,例如:

public interface Key {}

private static final class StringKey implements Key {
    private final String value;

    public StringKey(String value) {
        this.value = value;
    }

    // hashCode, equals here
}

// IntegerKey, FloatKey, etc similarly
然后做一些类似的事情:

HashMap<Key, Integer> map = new HashMap<Key, Integer>();
HashMap map=newhashmap();

我不完全确定这是否是您所要求的,但听起来您可以为密钥使用某种类型的接口/抽象类,并针对每种密钥类型适当地实现/扩展它,例如:

public interface Key {}

private static final class StringKey implements Key {
    private final String value;

    public StringKey(String value) {
        this.value = value;
    }

    // hashCode, equals here
}

// IntegerKey, FloatKey, etc similarly
然后做一些类似的事情:

HashMap<Key, Integer> map = new HashMap<Key, Integer>();
HashMap map=newhashmap();

我建议创建一个从say HashMap继承的自定义类,在插入时检查指定的键/值是否有效

public static final HashMap<String, Class<?>> allowedTypes = new HashMap<String, Class<?>>() {{
    put("key1", String.class);
    put("key2", Integer.class);
    // etc
}};

public class CustomHashMap extends HashMap {
    public Object put(Object key, Object value) {
        Class<?> type = allowedTypes(key);

        if(type != null && !type.isInstance(value))
            throw new IllegalArgumentException("Invalid type for key " + key);

        return put(key, value);
    }

    private void PutAll(Map m) {
        for(Entry<?, ?> entry : m.entrySet())
            put(entry.getKey(), entry.getValue());
    }
}
publicstaticfinalhashmap>(){{
put(“key1”,String.class);
put(“key2”,Integer.class);
//等
}};
公共类CustomHashMap扩展了HashMap{
公共对象put(对象键、对象值){
类类型=允许的类型(键);
if(type!=null&!type.isInstance(value))
抛出新的IllegalArgumentException(“键的类型无效”+键);
返回put(键、值);
}
专用void PutAll(地图m){
对于(条目:m.entrySet())
put(entry.getKey(),entry.getValue());
}
}

我建议创建一个从say HashMap继承的自定义类,在插入时检查指定的键/值是否有效

public static final HashMap<String, Class<?>> allowedTypes = new HashMap<String, Class<?>>() {{
    put("key1", String.class);
    put("key2", Integer.class);
    // etc
}};

public class CustomHashMap extends HashMap {
    public Object put(Object key, Object value) {
        Class<?> type = allowedTypes(key);

        if(type != null && !type.isInstance(value))
            throw new IllegalArgumentException("Invalid type for key " + key);

        return put(key, value);
    }

    private void PutAll(Map m) {
        for(Entry<?, ?> entry : m.entrySet())
            put(entry.getKey(), entry.getValue());
    }
}
publicstaticfinalhashmap>(){{
put(“key1”,String.class);
put(“key2”,Integer.class);
//等
}};
公共类CustomHashMap扩展了HashMap{
公共对象put(对象键、对象值){
类类型=允许的类型(键);
if(type!=null&!type.isInstance(value))
抛出新的IllegalArgumentException(“键的类型无效”+键);
返回put(键、值);
}
专用void PutAll(地图m){
对于(条目:m.entrySet())
put(entry.getKey(),entry.getValue());
}
}

您可以有单独的映射,一个用于字符串;当添加到这些映射中的任何一个时,您可以将密钥添加到(全局)集合中,以确保在映射中没有重复的密钥。我怀疑这并不能很好地满足您的需求(当然,查找更复杂),但如果它对您有效,那就太好了


也许更好的选择是添加另一个间接级别。使您的映射成为Hashmap,其中您的东西对于您想要持有的每种类型都有子类。因此,StringYourThing有一个字符串数据成员;一个IntegerYourThing有一个int数据成员,等等。当我发现YourThing开始使用另一个类中的switch语句的功能时,我不会感到惊讶,这个类试图一致地处理所有这些不同的数据类型。如果该类可以简单地与YourThing交互,它可能会变得更简单。但是,如果不查看代码,就很难知道;当添加到这些映射中的任何一个时,您可以将密钥添加到(全局)集合中,以确保在映射中没有重复的密钥。我怀疑这并不能很好地满足您的需求(当然,查找更复杂),但如果它对您有效,那就太好了

也许更好的选择是添加另一个间接级别。使您的映射成为Hashmap,其中您的东西对于您想要持有的每种类型都有子类。因此,StringYourThing有一个字符串数据成员;一个IntegerYourThing有一个int数据成员,等等。当我发现YourThing开始具有功能时,我不会感到惊讶