【问题标题】:how to enforce that Collection that contain only objects that implement a interface , but are from the same implementing class?如何强制只包含实现接口的对象但来自同一个实现类的集合?
【发布时间】:2017-07-19 06:40:28
【问题描述】:

假设有一个名为 Entity 的接口,那么有很多类实现它。 我需要为类的每个实例创建一个类,它的集合将仅包含实现接口实体的对象,但来自相同的实现类,例如 - 如果 Person 和 Bicycle 实现接口实体,则该类的实例将具有仅包含 Person 对象或 Bicycle 对象但不能同时包含两者的集合。 感谢您的帮助!

【问题讨论】:

  • Collection<Person> theCollection (resp. Collection<Bicycle> ...) !?真的,你的问题有点不清楚。
  • 您不能通过 Java 的类型系统(例如,您无法确保列表中的所有内容都是精确类型,而不是该类型的子类;但您的设计不应该要求您到)。您所能做的就是在运行时验证列表中实例的类型。
  • 您可以声明具有多个边界的有界类型 (<T extends Bicycle & Entity>),但我真的不明白这一点。你能分享一些代码吗?

标签: java design-patterns interface


【解决方案1】:
public class Something<T extends Entity> {
[...]
private Collection<T> entities;

T 将始终是实现Entity 的一类。你可以在这个类的所有方法中使用T

【讨论】:

    【解决方案2】:

    如果你真的想这样做,你可以编写自己的 add 函数,并将新 Object 的类与集合中第一个 Object 的类进行比较。 (如果您的集合中没有对象,只需添加它)

    void add(Entity ent) {
        if (collection == null) {
            collection = new Collection<Entity>();
            collection.add(ent);
        }
        else if(ent.getClass().equals(collection.get(0).getClass()) {
            collection.add(ent);
        }
        else {
            // wrong class error handling here
       }
    }
    

    类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2017-01-23
      • 1970-01-01
      • 2022-06-11
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多