【问题标题】:Creating an argument handler for managing and parsing command arguments创建用于管理和解析命令参数的参数处理程序
【发布时间】:2014-05-26 09:23:02
【问题描述】:

对于命令系统的实现,我希望用户能够将他们想要的类型的 class[] 表示为他们的命令参数,并有一个方法接受他们可以使用的那些类型,并预先解析参数.

例如

玩家想要创建一个统计命令来列出玩家统计数据。 该命令的语法为 /info PLAYER_NAME STATISTIC_NAME

在代码端,我希望用户能够扩展我的 Command 类并访问方法

public void resolve(S arg1, T arg2);

这里我们现在必须有泛型,如果我有很长的列表或参数,这是一个问题。此外,S 和 T 必须实现一些接口,以便它们可以从 String 转换为它们的类型。也没有类数组,只有各种不能确保 100% 兼容性的重载方法 例如,如果我想要一个 Integer 参数,我不能只修改 Integer 来帮助我。我尝试的解决方案是创建一个参数包装器(ArgType)并让 S 和 T 扩展 ArgType,这工作正常,直到我尝试通过使用管理器将类存储到实例来使 ArgType 成为伪单例。这是一个问题,因为

Map<Class<? extends ArgType<T>, ArgType<T>>

不是有效语句,因为未定义 T。有没有办法让这张地图在不大量投射的情况下工作,或者有更好的方法来完全做到这一点?

【问题讨论】:

  • 我不确定泛型是否会帮助您。也许是反思。
  • 基础是当一个命令被解析时,首先发生的是一个巨大的列表: int arg1 = Integer.valueOf(args[0]);双 arg2 = Double.valueOf(args[1]);玩家 player = Players.getByName(args[2]);相反,我想对这些进行预处理,因此,我想我需要 的泛型

标签: java generics arguments


【解决方案1】:

没有强制转换的泛型无法做到这一点。实际上,您在这里得到的是类型安全的异构容器模式的变体,如 this answer 中所讨论的,只是它是类型安全的异构参数列表,而不是容器。

对于它的价值,如果您不介意切换语言,您可以查看 Scala tuples,这基本上是您正在寻找的类型安全通用列表。即便是底层的 Scala 也有一百万个(嗯,22 个)Tuple 实现类,不过,Tuple1[T]Tuple2[T1, T2]Tuple3[T1, T2, T3] 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多