临时思路

原创
2013/12/10 16:22
阅读数 503
关于 http://www.oschina.net/question/1394318_136972 问题的临时思路,尚未来得及实践。
public class GenericTypeBridge
{

	// 实体对象
	private Object content;

	// 实体及其泛型参数的类型
	private Object[] types;

	// 用实体对象、实体及其范型参数的类型构造一个“桥”
	public GenericTypeBridge(Object content, Object... types)
	{
		// 构造时校验与赋值代码省略
	}

	// 用于探知实体及其泛型参数的类型
	public Object[] getTypes()
	{
		// 数组拷贝代码省略
		return types;
	}

	// 取出实体
	public Object getContent(Object... types)
	{
		// 与构造中的类型对比;
		// if (匹配)
		{
			// 由此证实这个实体可以按本方法所给的类型做强制转换是安全的,返回实体。
			return content;
			// 之后由调用者做强制类型转换,并用 @ 压制警告。
		}
		// else
		// {
		// 	与构造中的类型不匹配,按本方法所给的类型做强制转换风险过大,不予返回。
		// 	return null;
		// }
	}

}
预计会这样使用,在前一对象的某方法里先生成桥,把泛型变量及其涉及的各种类型包装起来:
private void methodA()
	{
		Map<Integer, Serializable> map = new HashMap<Integer, Serializable>();
		map.put(new Integer(0), "000");
		map.put(new Integer(1), "111");
		map.put(new Integer(2), "222");
		map.put(new Integer(3), "333");

		// 人工保证实体与类型的一致性 (恶心了点,但目前就这水平) 。
		GenericTypeBridge b = new GenericTypeBridge(map, Map.class,
				Integer.class, Serializable.class);

		ClassB clazzB = new ClassB();
		clazzB.serv(b);
	}
编写 ClassB 的 serv(...) 方法时已知期望的泛型变量的类型;
把这些类型送到桥里判别一下,匹配,就能拿到泛型对象,不匹配则拿不到;
既然匹配才拿得到,再做强制类型转换应该就是安全的了:
public void serv(Object o)
	{
		Map<Integer, Serializable> here_Needs_A_Map = null;

		if (null != o && o instanceof GenericTypeBridge)
		{
			GenericTypeBridge b = (GenericTypeBridge) o;

			// 既然不匹配就拿不到值,那么能拿到就是匹配了。压掉这个异常。
			@SuppressWarnings({ "unchecked" })
			Map<Integer, Serializable> mapContent = (Map<Integer, Serializable>) b
					.getContent(Map.class, Integer.class, Serializable.class);
			here_Needs_A_Map = mapContent;
		}

		here_Needs_A_Map.put(new Integer(4), "444");
	}
值得考虑: http://tieba.baidu.com/p/2752312744#42843628258
展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部