【问题标题】:TreeMap with generic key types具有通用键类型的 TreeMap
【发布时间】:2016-02-28 19:23:54
【问题描述】:

我正在使用 TreeMap 添加 <Integer,Long> 类型的条目。但是,我可能会遇到条目类型为 <Long, Long> 的情况,我想构建一个可以处理这两种情况的 TreeMap。到目前为止,我有

public class myClass {
    public TreeMap<Integer, String> myClass(String fileToRead) {
        ....
        TreeMap<Integer, String> map = new TreeMap<>();    
        map.put(Integer, String); //this is a for loop that iterates through input list
    }
    return map
} 

如何添加可以是整数或长整数的通用键 K?

编辑:我想包括其他类型,例如 BigInteger

【问题讨论】:

  • Int 你的意思是Integer?因为没有Int这样的东西。
  • 是的,我更正了。
  • 你能告诉我们你打算如何使用这个类,关于这两种类型吗?
  • 如果您使用键 1 和键 1L 输入一个值,您希望发生什么?两个条目还是一个条目?

标签: java treemap


【解决方案1】:

两者的超类型都是Number,所以你可以使用它

【讨论】:

  • 如果你使用 1 的键值和 1L 的键值,会发生什么?那会是可取的吗?
  • 之后你有两个键 - Integer(1) 和 Long(1),如果它是你想要的取决于要解决的问题
【解决方案2】:

听起来你可能想要类似的东西

public class MyClass<T extends Number> {
  public TreeMap<T, String> myClass(String fileToRead) {
  ...
}

BigInteger 也将填写 Number 账单。

但是为了避免泛型的复杂性,我实际上建议始终使用Long 作为键类型,甚至使用BigInteger,除非你有强烈的要求不要这样做。根据您使用的 JVM(64 位),Integer 对象甚至可能不会比 Long 对象使用更少的空间。

【讨论】:

    【解决方案3】:

    您始终可以使用instanceof 运算符检查ReferenceType 并相应地工作:

    if (obj instanceof Long) { ... }
    if (obj instanceof Integer) { ... }
    

    来自JLS

    关系表达式instanceofReferenceType

    在运行时,如果RelationalExpression 的值不是null,则instanceof 运算符的结果为真,并且可以将引用(第15.16 节)强制转换为ReferenceType 而无需引发@987654330 @。否则结果为false

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多