使用泛型创建类的基类的实例

时间:2013-10-29 14:58:21

标签: java generics subclass abstract superclass

在我的Java项目中,我有一个使用泛型类型的抽象类。我的类由一些具体的子类扩展和实现。我的源代码是这样的:

class Metrics<T extends Dataset>
{
    public float evaluate(T dataset, Entity x, Entity y);
}

class MetricsType1 extends Metrics<DatasetType1>
{
    public float evaluate(DatasetType1 dataset, Entity x, Entity y);
}

class MetricsType2 extends Metrics<DatasetType2>
{
    public float evaluate(DatasetType2 dataset, Entity x, Entity y);
}

在我的主应用程序中,我以这种方式使用我的类:

Metrics<DatasetType1> metrics1 = new MetricsType1();
Metrics<DatasetType2> metrics2 = new MetricsType2();

我想使用相同的引用“metrics”,而不是使用两个不同的引用“metrics1”和“metrics”,这样我就可以使用MetricsType1或MetricsType2类来实现我的“metrics”引用,而不必分别写两个引用。

特别是我想写这样的东西:

Metrics metrics = null;
metrics = new MetricsType1();
// ...
metrics = new MetricsType2();

显然,Java解释器给了我一个警告,告诉我应该使用类Metrics类的泛型参数。

我怎么能处理这个?

谢谢!

2 个答案:

答案 0 :(得分:3)

使用通配符:

Metrics<?> metrics;

或者,如果你更具体:

Metrics<? extends Dataset> metrics;

在这种特殊情况下,这些都是同义词,因为Metrics被定义为T extends Dataset

但请注意,使用此定义时,无法直接调用evaluate方法 。您必须将对象强制转换为具体的子类才能执行此操作。

答案 1 :(得分:0)

你想要Metrics<?> 如果存在公共基本类型,您还可以使用Metrics<? extends CommonType>