map中有办法控制禁止使用某些key吗?

berg369 2009-08-08 10:25:28
1、我需要一个map--mapA给freemarker赋值,我已经在mapA put进了几个值,然后执行action(业务功能)后将返回另一个新map--mapB,我需要将它合并后给freemarker,即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
...全文
155 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
berg369 2009-08-09
  • 打赏
  • 举报
回复
谢谢大家!
看来这两个问题,都得自己编写代码实现了。
1、想避免map.putAll()不覆盖原有值,无法通过java的规则实现并在编译期检查来控制,只能自己编码实现。
2、方法返回值中的范型约束根本上不起作用,可看作是一种提示。
sangshusen_1988 2009-08-08
  • 打赏
  • 举报
回复
就算key是Integer类型的,get的时候估计也得get(new Integer(555));把
bigbug9002 2009-08-08
  • 打赏
  • 举报
回复
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,但也返回了
}
}
berg369 2009-08-08
  • 打赏
  • 举报
回复
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));
}
}

chenliuyang 2009-08-08
  • 打赏
  • 举报
回复
System.out.println(aa.map.get(555));
你这 aa 对象在哪里,
代码都写错,
如果是调用 dodo().get(); 在get方法里只能放String不是的话编译都通不过,
还说有执行结果,你骗谁啊。
捏造的信仰 2009-08-08
  • 打赏
  • 举报
回复
自己写一个类吧:
/**
* 带有“只读”键的 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);
}
}
feng_jyie 2009-08-08
  • 打赏
  • 举报
回复
楼主的第一个问题:
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);
}
bigbug9002 2009-08-08
  • 打赏
  • 举报
回复
如果是这样的话,用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,但也返回了
}
}


shaolin45 2009-08-08
  • 打赏
  • 举报
回复
擦除
  · Java
  语言中的泛型基本上完全在编译器中实现,由编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码。这种实现技术称为擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)。
  · 泛型基本上都是在 Java 编译器中而不是运行库中实现的,所以在生成字节码的时候,差不多所有关于泛型类型的类型信息都被“擦掉”了。换句话说,编译器生成的代码与您手工编写的不用泛型、检查程序的类型安全后进行强制类型转换所得到的代码基本相同。
  · 当生成泛型类的字节码时,编译器用类型参数的擦除 替换类型参数。对于无限制类型参数(<V>),它的擦除是 Object。对于上限类型参数(<K extends Comparable<K>>),它的擦除是其上限(在本例中是 Comparable)的擦除。对于具有多个限制的类型参数,使用其最左限制的擦除。
berg369 2009-08-08
  • 打赏
  • 举报
回复
3楼:无法约束开发者必须这样写:Map<String,Object> map1=new HashMap<String,Object>();//这行应该是这样的.如果写成这样:Map map1=new HashMap();一样可以编译

本帖的目的就是想找到约束开发者的方法。

4楼:执行一下就知道,直接get(555)就可以

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧