【问题标题】:Collection allowing multiple, predefined types允许多种预定义类型的集合
【发布时间】:2015-02-15 19:34:48
【问题描述】:

正如问题所述,是否可以定义一个仅允许一组预定义且可能不相关的类型(即不从公共对象扩展)的集合。这种事:

List<Foo|Bar> list = new ArrayList<Foo|Bar>();
list.add(new Foo());//Allow
list.add(new Bar());//Allow
list.add(new Baz());//Disallow

由于我以前从未见过这样做,我假设这可能是不可能的。如果没有,那么有充分的理由为什么不这样做?

我想一个解决方案是让每个必要的类都继承一个空接口,然后将列表的类型设置为这个接口。这会被视为“正常”做法吗?

【问题讨论】:

  • 是的,在这种情况下使用“标记界面”是可以的。
  • 啊,当你知道要谷歌什么时,一切都会变得更容易!

标签: java generics collections types interface


【解决方案1】:

这是不可能的(假设FooBar 除了Object 之外没有公共超类并且没有公共接口)。

原因:

假设有可能:

List<Foo|Bar> list = new ArrayList<Foo|Bar>();
list.add(new Foo());//Allow
list.add(new Bar());//Allow

现在,list.get(0) 会返回什么类型?

这两行都不能通过编译,因为list.get(0) 不能同时属于这两种类型:

Foo foo = list.get(0);
Bar bar = list.get(0);

这意味着唯一可以编译的是:

Object obj = list.get(0);

这与使用原始 List 类型相比没有任何优势。

【讨论】:

  • 好吧,这是有道理的。我主要希望首先防止错误的类型被添加到列表中,以便我可以可靠地转换出来的对象。我将使用标记接口代替
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多