java - 无法访问java泛型类的方法

标签 java generics

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

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

这就是我正在使用的:

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;
    } 
    ...
}

这似乎有效。这三个类均使用正确的key 扩展自ProbabilityPair。我正在尝试更进一步。我还有其他三个对象,它们本质上是不同 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 方法。所以调用失败。

<小时/>

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

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

关于java - 无法访问java泛型类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37466350/

相关文章:

java - Hazelcast LIKE/ILIKE 谓词/整数/长整型查询

Java继承和泛型问题

java - 方法参数的泛型类型

java - smslib 不发送短信为什么?

java - 泛型类的类对象(java)

c# - 如何使用不明确的泛型参数指定 C# 返回值?

c# - 通过通用方式创建任何 C# 类的实例

java.net.UnknownHostException 从 spring boot 应用程序 dockerized mysql

java - 如何将 JLabel 对齐到 JPanel 的底部

Java 循环未按预期打印结果