繁体   English   中英

无法访问Java泛型类的方法

[英]Can't access methods of a java generics class

我最近写了一些充满代码重复的代码,我想对其进行改进。 我有一些对象非常相似,但不够相似,这将在下面解释。

我将从第一组对象开始。 我有三个对象, 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;
    } 
    ...
}

这似乎正在工作。 这三个类中的每一个都使用正确的keyProbabilityPair扩展。 我正在尝试进一步。 我还有其他三个对象,它们实际上是不同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的一个,而该对持有它的计数(并通过关联,即概率)。 因此,在添加时,我会检查它是否存在,如果存在,请增加计数而不是添加新对象。

public class Container<ProbabilityPair>

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

Object没有increment方法。 因此通话失败。


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

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

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

我想您想像这样将Container定义为泛型:

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

等等。某物的Container包含某物的ProbabilityPair对。 对?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM