java - 在 Java 中使用泛型和类型推断的问题

标签 java generics types inference

这段时间我正在做一个需要某种抽象的项目,但我不知道如何解决一些与java泛型和类型推断相关的问题。

这是源代码的简化架构:

public abstract class BaseDataset
{
    // Some data
    // Some methods
}

public class DerivedDataset1 extends BaseDataset
{
    // Some data
    // Implementations of some BaseDataset methods
    // Some additional methods
}

public class DerivedDataset2 extends BaseDataset
{
    // Some data
    // Implementations of some BaseDataset methods
    // Some additional methods
}

public interface BaseMeasure<T extends BaseDataset>
{
    public float evaluate(T dataset);
}

public class DerivedMeasure1 implements BaseMeasure<DerivedDataset1>
{
    @Override
    public float evaluate(DerivedDataset1 dataset)
    {
        // evaluate some measure using DerivedDataset1 methods
        return the evaluated measure;
    }
}

public class DerivedMeasure2 implements BaseMeasure<DerivedDataset2>
{
    @Override
    public float evaluate(DerivedDataset1 dataset)
    {
        // evaluate some measure using DerivedDataset2 methods
        return the evaluated measure;
    }
}

public class SocialNetworkBuilder
{
    public <T extends BaseDataset> void build(T dataset, BaseMeasure<T> measure)
    {
        float weight = measure.evaluate(dataset);

        // ...
    }
}

我的问题是,如果在我的主类中,我写了这样的内容:

public class Application
{
    public static void main(String [] args)
    {
        BaseDataset dataset = new DerivedDataset1();
        BaseMeasure<? extends BaseDataset> measure = new DerivedMeasure1();
        SocialNetworkBuilder socialNetworkBuilder = new SocialNetworkBuilder();
        socialNetworkBuilder.build(dataset, measure);
    }
}

Eclipse 给我错误:“SocialNetworkBuilder 类型中的方法 build(T, BaseMeasure) 不适用于参数 (BaseDataset, BaseMeasure)”

我认为问题在于“构建”方法必须确保数据集和度量属于同一类型 T。

如果我做这样的事情:

public class Application
{
    public static void main(String [] args)
    {
        BaseDataset dataset = new DerivedDataset1();
        BaseMeasure<? extends BaseDataset> measure = new DerivedMeasure1();
        SocialNetworkBuilder socialNetworkBuilder = new SocialNetworkBuilder();
        socialNetworkBuilder.build((DerivedDataset1) dataset, (DerivedMeasure1) measure);
    }
}

它可以工作,但我无法以这种方式解决我的问题,因为我不知道编译时“数据集”和“测量”实例的派生类型; “dataset”和“measure”应该根据运行时给出的一些参数进行实例化。

我需要在运行时实例化我的“measure”和“dataset”变量,并且仍然能够调用它们的“build”方法。

您有解决这个问题的想法吗?

谢谢。

最佳答案

当您按如下方式更改时,您的应用程序将编译:

public class Application
{
    public static void main(String [] args)
    {
        DerivedDataset1 dataset = new DerivedDataset1();
        BaseMeasure<DerivedDataset1> measure = new DerivedMeasure1();
        SocialNetworkBuilder socialNetworkBuilder = new SocialNetworkBuilder();
        socialNetworkBuilder.build(dataset, measure);
    }
}

关于java - 在 Java 中使用泛型和类型推断的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20163246/

相关文章:

c# - 带输出参数的 Lambda 泛型表达式

python - 使用 python 缩进命名空间

c++ - If 函数参数内的语句;分支类型

java - 当我尝试将两个 (.txt) 文件合并到另一个 (.txt) 文件中时,为什么我的代码不起作用?

java - Java Generics 和 Apache Olingo 4 的编译错误

java - 如何为您的 POJO 生成 Builder java 类

C# 泛型,状态模式的交叉引用类

Python - 如何获取 CSV 文件中所有列的数据类型?

java - 正则表达式,使用 ".*"进行向后查找/先行查找

java - 为什么 Collections.max() 不返回字符串集合的实际最大值?