无法访问java泛型类的方法

时间:2016-05-26 16:26:43

标签: java generics

我最近编写了一些代码重复完整的代码,我想改进它。我有很多非常相似的对象,但不够相似,我将在下面解释。

我将从第一组对象开始。我有三个对象TagProbabilityWordProbabilityTokenProbability。这些都具有完全相同的方法,它们具有不同类型的一个数据成员。其中两个人有一个String而另一个人有enum我创建的SpeechTag。我想将它提取到一个类中,因为它们的大多数方法都具有基本相同的实现。我知道你可以使用泛型完成这类事情:

这就是我正在使用的:

public class WordProbability extends ProbabilityPair<Str>
{
    public WordProbability(String tag)
    {
        super(tag);
    }
    ...
}

ProbabilityPair具有以下结构。

public abstract class ProbabilityPair<T>
{
    public T key;
    private int count;
    private double probability;

    protected ProbabilityPair(T key)
    {
        this.key = key;
        count = 1;
        probability = 0d;
    }

    public void increment()
    {
        ++count;
    } 
    ...
}

这似乎有效。这三个类中的每一个都使用正确的ProbabilityPairkey延伸。我想更进一步。我有三个其他对象,它们本质上是不同ProbabilityPair的容器。

以下是其中一个容器的示例:

public class Words
{
    public List<WordProbability> words;
    public int totalCount;

    public Words()
    {
        words = new ArrayList<>();
        totalCount = 0;
    }

    public void add(WordProbability word)
    {
        if (words.contains(word))
        {
            words.get(words.indexOf(word)).increment();
        } else
        {
            words.add(word);
        }
        ++totalCount;
    }
    ...
}

我尝试将add方法提取到另一个通用类Container中,如下所示:

public class Container<ProbabilityPair>
{
    private List<ProbabilityPair> members;
    private int totalCount;

    public void add(ProbabilityPair member)
    {
        if (members.contains(member))
        {
            members.get(members.indexOf(member)).increment();
        } else
        {
            members.add(member);
        }
        ++totalCount;
    }
}

但是行members.get(members.indexOf(member)).increment();无法编译。它找不到方法。它位于ProbabilityPair中,您可以在上面的代码片段中看到。

我认为我误解了泛型在这种情况下是如何工作的,但我无法弄清楚我做错了什么。

编辑让我再解释一下。实际上,每个容器的功能更像是一个集合而不是列表。它拥有每个ProbilityPair中的一个,并且该对保持它的计数(并通过关联,概率)。所以,当我添加时,我会检查它是否存在,如果是,则增加计数而不是添加新对象。

2 个答案:

答案 0 :(得分:1)

public class Container<ProbabilityPair>

声明一个名为ProbabilityPair的类型变量,该变量将被删除为Object

Object没有increment方法。所以呼叫失败了。

您应该为您的类型变量添加一个绑定,并将其更改为不与您的ProbabilityPair类型冲突。

public class Container<T extends ProbabilityPair<?>> {
    private List<T> members;
    ...
}

答案 1 :(得分:0)

您没有正确定义Container,因为您将其定义为泛型类,其泛型参数名为ProbabilityPair,与同名的泛型类无关。它与定义class Container<U>完全一样。

我想你想将Container定义为这样的通用:

public class Container<U> {
    private List<ProbabilityPair<U>> members;

等。一个Container的东西包含{​​{1}}的东西。正确?