【问题标题】:Casting from Void, storing any type in a Map从 Void 铸造,在 Map 中存储任何类型
【发布时间】:2010-11-13 20:30:11
【问题描述】:

我想像这样在 Map 中存储不同的类型:

public Map< String, Void > common;
MyClass object = new MyClass();
common.put( "Object1", object );

然后像这样使用它:

Void object = common.get( "Object1" );
( ( MyClass )object ).runAnyFunction();

这仅在我创建自己的名为 Void 的空类并扩展我将使用 Void 放入 Map 中的所有类时才有效。所以问题解决了,除非...

Java 中不是已经有 Void 了吗?如果我不创建自己的 Void 类仍然有效。直到我到达我尝试.runAnyFunction() 的演员表。也许如果我尝试使用 Void 扩展我的类 - 但这仅适用于我创建的 Void,而不适用于 Java 的 Void。

这真的归结为我是否真的需要创建自己的空 Void 类。或者如果我可以使用 Java 自己的 Void?

【问题讨论】:

  • Void Java 中的类是泛型的返回类型标记,不能被实例化,实际上你可以真正使用的唯一部分是Void.TYPE,它只返回Class&lt;Void&gt;

标签: java casting void


【解决方案1】:

为什么不使用 Object?所有 Java 类都是 Object 的直接或间接子类。

public Map< String, Object > common;

【讨论】:

  • 初始化地图也很重要:)
  • 这是一个很好的问题!为什么我不使用对象?嗯...谢谢!
【解决方案2】:

很抱歉提出这个问题,但您为什么要使用此解决方案?我认为每次你想将一种类型转换为另一种类型时,你都应该停下来重新考虑一下你的设计。

真的,你想执行方法“runAnyFunction()”。那么创建界面呢

公共接口亚军{ public void runAnyFunction();

}

现在将您的地图定义为地图。

那么你可以说 map.get("foo").runAnyFunction() 没有任何转换。

您可以根据需要创建任意数量的 Runner 实现。这称为多态性,通常是面向对象的设计。

下一步可能是重用现有接口之一,例如可运行或可调用。

我什至写了一篇关于现有接口的这种用法的短文:http://java.dzone.com/articles/useful-abuse

【讨论】:

  • 因为我有不同接口的对象。如果他们都有函数 runAnyFunction() 那么这样做就可以了。但是,它们具有不同的功能和公共变量。但它们确实有唯一的 ID。这就是为什么我将所有对象存储在一张地图上并通过它们的 ID 调用它们......
猜你喜欢
  • 1970-01-01
  • 2011-04-20
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多