【问题标题】:<? extends Animal> Generics , can it be used as a single paramenter rather than a collection (arraylist etc)<? extends Animal> Generics ,它可以用作单个参数而不是集合(数组列表等)
【发布时间】:2014-08-14 11:50:02
【问题描述】:

有人要求我使用 "?extends" ,但要求我传递单个参数而不是列表。任何人都可以帮助我,我可以写出类似下面的方法。我猜我从泛型学了什么? extends 可以与集合对象一起使用,而不是单个对象。

public void verify(<? extends Account> account) {}

在方法中我需要检查传递了什么子类型,然后在另一个对象上发送适当的命令

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 相比public void verify(Account account) 有什么好处? (不,&lt;? extends ...&gt; 不要求您使用集合,但我认为这与这里无关。)
  • 我要求只接受子类型,这就是为什么,我在 Eclipse 中尝试,使用时出现编译错误?扩展帐户。
  • 您的意思是您不想接受Account 实例吗?因为&lt;? extends Account&gt; 确实 无论如何都允许Account,所以你尝试的对你没有帮助。
  • 好的,谢谢,那还有什么办法呢?
  • 那么为什么你只想接受子类型而不是接受Account?这真是一个奇怪的要求。你确定这就是你需要的吗?

标签: generics wildcard extends


【解决方案1】:

是的,你可以这样做,很简单:

public void verify(Account account);

现在,您可以提交 任何扩展 Account 的内容。

class Account {}
class Account2 extends Account{}

verify(new Account2()); // works like a charm!

Java 中的类型已经是协变的,因此您不需要任何通配符。您不能在此处使用通配符,但您不必这样做。

【讨论】:

  • 是的,我将超类型声明为抽象,在方法中我需要检查传递了什么子类型,然后在另一个对象上发送适当的命令。编辑我最初的问题。
  • @user1688879:为什么需要检查传入的是什么子类型?这通常是一种设计气味......
  • 哦,不知道它实际上是设计气味。实际上是从以这种方式设计它的领导那里得到的:要求是:我正在实现 EventBus,所以听一种类型的事件子类型我需要发布另一种事件子类型,所以你能建议我如何以更好的方式设计它确保实施正确的设计。
【解决方案2】:

也许你的问题不是很清楚,但我认为你被要求提供可以接受和使用 Interface 帐户的方法,所以如果你使用Polymorphism,在body 你需要做的就是通过类型检查(可以认为不是一个好主意)并进行强制转换,以便逻辑能够根据帐户完成操作。

更新:

有时这表明类层次结构或使用它的代码(您的方法)可能需要重构或重组。但通常不会有避免问题的重构/重组。 我所做的是这种情况 - 显然,您的 Interface 帐户(或其某些扩展)需要一个调用方法,该接口的每个实现者都可以根据自己的需要编写代码以多态地执行此任务 - 似乎是唯一的OO-健全的方法!对于这些,您可以使用Interface segregation principle

【讨论】:

  • 谢谢,方法应该只接受子类型,类型检查我根本不想做,还有什么替代方法?
【解决方案3】:

如果是设计,你可以试试State Design Pattern 。这是有用的设计:

参与此模式的类和对象是:

上下文帐户) 定义客户感兴趣的接口 维护一个定义当前状态的 ConcreteState 子类的实例。

) 定义了一个接口,用于封装与 Context 的特定状态相关的行为。

具体状态RedState、SilverState、GoldState) 每个子类都实现了与上下文状态相关的行为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2017-01-10
    • 2013-09-23
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多