【问题标题】:Subclassing and generics子类化和泛型
【发布时间】:2023-03-14 13:50:02
【问题描述】:

请注意:虽然这个问题专门针对Hystrix,但它更多地是关于Java泛型,可以这样回答。

我正在尝试使用 BaseCommand 子类化 HystrixCommand,然后我的应用程序的其余部分可以将其子类化。这个BaseCommand 将包含其他命令子类可以免费继承的各种好东西。

到目前为止我最好的尝试:

public class BaseCommand<T> extends HystrixCommand<T> {
    // Stuff
}

public class FunnyCommand<Widget> extends BaseCommand<Widget> {
    // Stuff
}

但这会产生以下编译器错误:

com.netflix.hystrix.HystrixCircuitBreaker$UnitTest$BaseCommand类引用com.netflix.hystrix.HystrixCircuitBreaker$UnitTest$BaseCommand类,使用1个参数,但引用的类不带参数

它还会产生以下编译器警告:

类型参数String隐藏了String类型

我该如何重写这个:

  1. BaseCommandHystrixCommandany 类型的通用(T? 等);和
  2. BaseCommand 子类对于 any 具体类型(String、Long、Widget 等)是通用的;和
  3. 不存在编译器错误或警告

这里是 Java 7。

【问题讨论】:

  • 请显示您的实际代码或实际错误。第二个错误不适用于您显示的代码。
  • 这个FunnyCommand&lt;Widget&gt; 声明了一个名为Widget 的类型参数,独立于您在其他任何地方声明的任何Widget 类型。

标签: java generics inheritance subclass


【解决方案1】:
public class FunnyCommand extends BaseCommand<Widget> {

Widget 只是一个类型,所以你不需要将它声明为类型变量。不幸的是,声明和使用看起来很相似。

在以下代码中,标识符T 用于两个不同的角色。

public class BaseCommand<T> extends HystrixCommand<T> {
                         ^ declare T               ^use T

【讨论】:

  • 感谢@Tom Hawtin - tackline (+1) - 但是当我将FunnyCommand&lt;Widget&gt; 更改为FunnyCommand 时,我仍然遇到同样的错误。想法?
  • @IAmYourFaja 嗯,不知道。看起来很奇怪的错误。一个快速的谷歌显示它与旧版本的 NetBeans 中的错误有关。你在用那个吗?如果是这样,升级到新版本可能会修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2020-09-24
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
相关资源
最近更新 更多