【问题标题】:Treeset Implementation of Map.Entry with Generic Types具有泛型类型的 Map.Entry 的树集实现
【发布时间】:2015-10-25 01:07:12
【问题描述】:

我正在构建一个频率表实现,其中哈希表表元素是链式树集。键/值对类的类定义如下:

public class CountablePair<F, S extends Comparable<? super S>> implements Comparable<S> {

我希望创建一个实现 Map.Entry 的新类 EntryTreeSet,并在其中包含一个 CountablePairs 树集。我当前的类声明代码、它的 treeset 变量和它的构造函数如下:

public class EntryTreeSet<F,S> implements Map.Entry<F,S> {

private TreeSet<CountablePair<F,S>> tree;

public EntryTreeSet() {
    this.tree = new TreeSet<CountablePair<F,S>>();
}

但是,这会产生以下错误语句:

EntryTreeSet.java:19:错误:类型参数 S#1 不在类型变量 S#2 的范围内 私有树集>树; ^ 其中 S#1,S#2 是类型变量: S#1 扩展了在类 EntryTreeSet 中声明的对象 S#2 扩展了在类 CountablePair 中声明的 Comparable EntryTreeSet.java:22:错误:类型参数 S#1 不在类型变量 S#2 的范围内 this.tree = 新树集>(); ^ 其中 S#1,S#2 是类型变量: S#1 扩展了在类 EntryTreeSet 中声明的对象 S#2 扩展了在类 CountablePair 中声明的 Comparable

我想知道如何正确地让我的树集保存 CountablePair 类的实例。

【问题讨论】:

  • 一件事立即脱颖而出:您使用的是原始类型:TreeSet&lt;CountablePair&gt;CountablePair 视为原始类型。您应该在声明中指定其参数。
  • 感谢您的反馈!我已经用指定的参数更新了我的问题。
  • 吹毛求疵,但应该是TreeSetEntryEntryTreeSet 这个名字让人相信它是一个条目树集。
  • 另外,你确定你的 TreeSet 的每个条目都有自己独立的 TreeSet 吗?
  • 我会尝试 class EntryTreeSet&lt;F,S extends Comparable&lt;? super S&gt;&gt; implements Map.Entry&lt;F,S&gt; 作为第二类的声明。

标签: java hashmap treeset


【解决方案1】:

似乎您的代码中唯一的问题是EntryTreeSet 声明中的S 参数没有边界。这样的类声明编译正确:

public class EntryTreeSet<F, S extends Comparable<? super S>> 
                         implements Map.Entry<F, S> {

【讨论】:

    【解决方案2】:

    S 是原始类型,这就是为什么会出现编译错误。 试试下面的代码。

    public class EntryTreeSet<F,S extends Comparable<? super S>> implements Map.Entry<F,S> 
    

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2012-04-10
      相关资源
      最近更新 更多