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
但是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
你这 aa 对象在哪里,
代码都写错,
如果是调用 dodo().get(); 在get方法里只能放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(new Test().dodo().get(555));
}
}
public Map<String, Object> dodo() {
Map<String,Object> map1=new HashMap<String,Object>();//这行应该是这样的.
map1.put(555, "aaaaaaaa"); //这行编译都通不过了.
return map1;//key不是String,但也返回了
}
}
· Java
语言中的泛型基本上完全在编译器中实现,由编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码。这种实现技术称为擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)。
· 泛型基本上都是在 Java 编译器中而不是运行库中实现的,所以在生成字节码的时候,差不多所有关于泛型类型的类型信息都被“擦掉”了。换句话说,编译器生成的代码与您手工编写的不用泛型、检查程序的类型安全后进行强制类型转换所得到的代码基本相同。
· 当生成泛型类的字节码时,编译器用类型参数的擦除 替换类型参数。对于无限制类型参数(<V>),它的擦除是 Object。对于上限类型参数(<K extends Comparable<K>>),它的擦除是其上限(在本例中是 Comparable)的擦除。对于具有多个限制的类型参数,使用其最左限制的擦除。
用下面的办法,可以解决你的问题.就是有点繁琐了。
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,但也返回了
}
}
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);
}
/**
* 带有“只读”键的 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);
}
}
看来这两个问题,都得自己编写代码实现了。
1、想避免map.putAll()不覆盖原有值,无法通过java的规则实现并在编译期检查来控制,只能自己编码实现。
2、方法返回值中的范型约束根本上不起作用,可看作是一种提示。