1、我需要一个map--mapA给freeer赋值,我已经在mapA put进了几个值,然后执行action(业务功能)后将返回另一个新map--mapB,我需要将它合并后给freeer,即mapA.putAll(mapB);
但是action由许多人开发,需要避免mapB中存在与mapA相同的key,否则mapA的同名key就会被覆盖了,能有办法通过java的规则实现并在编译期检查吗?2、看以下代码,map范型的控制不起作用吗?怎么可以达到目的(让key总是string类型)?public interface ITest {
public Map<String,Object> dodo();//规定key必须是string
}public class Test implements ITest{
    public Map<String, Object> dodo() {
Map map1=new HashMap();
map1.put(555, "aaaaaaaa");
return map1;//key不是String,但也返回了
}
    public static void main(String[] args) {
        System.out.println(aa.map.get(555));
    }
}执行结果:aaaaaaaa

解决方案 »

  1.   

      System.out.println(aa.map.get(555));
    你这 aa 对象在哪里,
       代码都写错,
      如果是调用 dodo().get(); 在get方法里只能放String不是的话编译都通不过,
         还说有执行结果,你骗谁啊。
      

  2.   

    sorry,是从代码中拿出一部分,没仔细看,最后一句应是System.out.println(new Test().dodo().get(555));
    完整代码:public interface ITest {
        public Map<String,Object> dodo();//规定key必须是string
    }public class Test implements ITest{
        public Map<String, Object> dodo() {
            Map map1=new HashMap();
            map1.put(555, "aaaaaaaa");
            return map1;//key不是String,但也返回了
        }
        public static void main(String[] args) {
            System.out.println(new Test().dodo().get(555));
        }
    }
      

  3.   

    public class Test implements ITest{
        public Map<String, Object> dodo() {
            Map<String,Object> map1=new HashMap<String,Object>();//这行应该是这样的.
            map1.put(555, "aaaaaaaa");  //这行编译都通不过了.
            return map1;//key不是String,但也返回了
        }
    }
      

  4.   

    就算key是Integer类型的,get的时候估计也得get(new Integer(555));把
      

  5.   

    3楼:无法约束开发者必须这样写:Map<String,Object> map1=new HashMap<String,Object>();//这行应该是这样的.如果写成这样:Map map1=new HashMap();一样可以编译本帖的目的就是想找到约束开发者的方法。4楼:执行一下就知道,直接get(555)就可以
      

  6.   

    擦除
      · Java
      语言中的泛型基本上完全在编译器中实现,由编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码。这种实现技术称为擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)。
      · 泛型基本上都是在 Java 编译器中而不是运行库中实现的,所以在生成字节码的时候,差不多所有关于泛型类型的类型信息都被“擦掉”了。换句话说,编译器生成的代码与您手工编写的不用泛型、检查程序的类型安全后进行强制类型转换所得到的代码基本相同。
      · 当生成泛型类的字节码时,编译器用类型参数的擦除 替换类型参数。对于无限制类型参数(<V>),它的擦除是 Object。对于上限类型参数(<K extends Comparable<K>>),它的擦除是其上限(在本例中是 Comparable)的擦除。对于具有多个限制的类型参数,使用其最左限制的擦除。
      

  7.   

    如果是这样的话,用java现成的语法是不能实现的了.
    用下面的办法,可以解决你的问题.就是有点繁琐了。
    import java.util.*; class MyClass{
       public final static HashMap<String,Object> myMap=new HashMap<String,Object>();
    } interface ITest {
        public MyClass dodo();//规定key必须是string
    }
     
    public class Test implements ITest{ 
        public static void main(String[] args) {
         Test t=new Test();
            System.out.println(t.dodo());
        }
        public MyClass dodo() {
            MyClass mc=new MyClass();
            mc.myMap.put(new Integer(555), "aaaaaaaa"); //编译通不过.
            return mc;//key不是String,但也返回了
        }
      

  8.   

    楼主的第一个问题:
        boolean flag = false;
        Set set = mapB.keySet();
        Iterator it = set.iterator();
        while(it.hasNext()){
            if(mapA.containsKey(it.next()){
                 flag = true;
                 break;
            }
        }
        if(!flag){
           mapA.putAll(mapB);
        }
      

  9.   

    自己写一个类吧:
    /**
     * 带有“只读”键的 Map
     */
    public class SwitchableMap<K, V> extends HashMap<K, V> {    private List<K> readonlyKeys = new ArrayList<K>();    /**
         * 将指定的键置为只读
         *
         * @param keys 要置为只读的键。
         */
        public void setReadOnly(K... keys) {
            readonlyKeys.addAll(Arrays.asList(keys));
        }    /**
         * 将指定的键置为可写
         *
         * @param keys 要置为可写的键。
         */
        public void setWritable(K... keys) {
            readonlyKeys.removeAll(Arrays.asList(keys));
        }    /**
         * 放入一个值
         *
         * @param key   键
         * @param value 值
         *
         * @return 被替换出来的值
         *
         * @throws IllegalStateException 如果键是只读的。
         */
        @Override
        public V put(K key, V value) {
            if (readonlyKeys.contains(key)) {
                throw new IllegalStateException("key " + key + " is readonly");
            }
            return super.put(key, value);
        }
    }
      

  10.   

    谢谢大家!
    看来这两个问题,都得自己编写代码实现了。
    1、想避免map.putAll()不覆盖原有值,无法通过java的规则实现并在编译期检查来控制,只能自己编码实现。
    2、方法返回值中的范型约束根本上不起作用,可看作是一种提示。