当前位置: 首页 > 面试题库 >

如何使此嵌套通用参数系统正常工作?

冀嘉木
2023-03-14
问题内容

因此,我正在尝试使一个相当复杂的系统正常工作。这是我正在尝试的基础知识。

规则:

abstract class Rule
{
  // stuff
}

class ExampleRule extends Rule
{
  // stuff
}

处理程序:

abstract class RuleHandler<T extends Rule>
{
  Class<T> clazz;
  RuleHandler(Class<T> forClass)
  {
    this.clazz = forClass;
  }
  abstract void doStuff(T rule);
}

class ExampleRuleHandler extends RuleHandler<ExampleRule>
{
  ExampleRuleHandler()
  {
    super(ExampleRule.class);
  }
  void doStuff(ExampleRule rule)
  {
    // stuff
  }
}

并将它们绑在一起:

class HandlerDispatcher
{
  Map<Class<? extends Rule>, RuleHandler<? extends Rule>> handlers;
  void register(RuleHandler<? extends Rule> handler)
  {
    handlers.put(handler.clazz, handler);
  }
  void doStuff(List<Rule> rules)
  {
    for(Rule rule : rules)
    {
      RuleHandler<? extends Rule> handler = handlers.get(rule.getClass());
      handler.doStuff(rule);
    }
  }
}

class Test
{
  void main()
  {
    HandlerDispatcher hd = new HandlerDispatcher();
    hd.register(new ExampleRuleHandler());
  }
}

到目前为止,我已经尝试了不同参数(通配符,受限符等)的各种组合,并且还没有进行与类型相关的错误的编译。欢迎任何见解,解决方案或替代方法。


问题答案:

观察到

  • 处理程序是私有的和最终的
  • handler.clazz是最终的
  • RuleHandler<T extends Rule> 暗示 RuleHandler<?> === RuleHandler<? extends Rule>

以下代码正确(并编译)

abstract class RuleHandler<T extends Rule>
{
  final Class<T> clazz;
  // as before
}

class HandlerDispatcher
{
  private final Map<Class<?>, RuleHandler<?>> handlers;
  void register(RuleHandler<?> handler)
  {
    handlers.put(handler.clazz, handler);
  }
  void doStuff(List<Rule> rules)
  {
    for(Rule rule : rules)
    {
      @SuppressWarnings("unchecked")
      RuleHandler<Rule> handler = (RuleHandler<Rule>) handlers.get(rule.getClass());
      handler.doStuff(rule);
    }
  }
}

class Test
{
  void main()
  {
    HandlerDispatcher hd = new HandlerDispatcher();
    hd.register(new ExampleRuleHandler());

    RuleHandler<?> handler = new ExampleRuleHandler();
    hd.register(handler);
  }
}


 类似资料:
  • 问题内容: 我是我的代码,我向ExecutorService提交了一些任务,然后使用shutdown()和awaitTermination()等待它们完成。但是,如果任何一项任务花费的时间超过某个时间段,我希望取消它而不影响其他任务。我使用来自ExecutorService的代码修改代码,该代码在超时后中断任务,如下所示: 一个测试用例,用于说明何时有时间完成任务以及何时它们都不工作 并且在我的代

  • 我正在尝试使用然而,不管我使用的闭包返回参数是什么,我似乎都会遇到异常。 无法使用类型为“”的参数列表调用“animateWithDuration”(NSTimeInterval,延迟:NSTimeInterval,选项:UIViewAnimationOptions,animations:()- 这就是冒犯功能 老实说,我一定尝试过闭包返回参数的所有可能组合(有选项和没有选项),但没有运气。例如:

  • 我是我的代码,我向ExecutorService提交一些任务,然后使用shutdown()和awaitTermination()等待它们完成。但是,如果任何一个任务需要超过一个特定的时间来完成,我希望它被取消,而不影响其他任务。我使用来自ExecutorService的代码修正代码,该代码在超时后中断任务,如下所示: 以及任务何时有时间完成和何时不能同时工作的测试案例 并且在我的代码中似乎起作用:

  • 问题内容: 我有一堆系统命令,它们与将新内容附加到文件非常相似。我编写了一个简单的脚本来执行系统命令,如果存在诸如“ ls”,“ date”等单个单词,该脚本就可以很好地工作。但是如果命令大于此范围,则程序将死亡。 以下是代码 以下是我看到的错误 我想,这可能是由于未单独发送cmds和参数(http://golang.org/pkg/os/exec/#Command)导致的。我想知道如何颠覆这个问

  • 问题内容: 为什么即使调用时返回并退出,嵌套函数仍会记住第一个值? 问题答案: 您可以看到它,因为所有源自父函数的变量都被子函数内的实际值替换。这样,无需跟踪父函数的范围即可使子函数正确运行。 将其视为“动态创建函数”。 这是python中的基本行为,对多个分配也是如此。 Python将其读取为 基本上,在对它们执行任何操作之前会先插入值。

  • 假设我们有python中的函数: 虽然我可能会将传递给A,但我正在寻找一种优雅的方法来传递类似于的东西来执行。 我现在看到的唯一方法是发送一个函数列表并按顺序应用它们。有没有更好的办法?