是否可以基于动态类型创建比较器?

时间:2014-02-19 20:29:22

标签: java types comparator

我一直在尝试通过对象的字段创建比较器,而我似乎无法将比较器的类型转换为我想要的类型。

我正在尝试做这样的事情:

public class Sort {

private ArrayList list;
public Class<?> type;
private Object obj = "Continent";

Sort(ArrayList list, String type) throws ClassNotFoundException
{
    this.list = list;
    this.type = Class.forName(type);

}
Comparator a = new Comparator<this.type>(){

    @Override
    public int compare(b.area o1, b.area o2) {
        // TODO Auto-generated method stub
        return 0;
    }

};

是否有可能或者我是否需要为每个单独的案例写出方法?

1 个答案:

答案 0 :(得分:0)

第一部分

  

有可能[...]?

不是你尝试它的方式。你的编译时间和运行时间都很混乱,即:

  • 泛型是Java中的纯编译时概念。实际上,在编译期间会删除泛型类型(称为type erasure)。它仅用于在编译之前为您提供类型安全性,这意味着在编写代码时。
  • 但实例type仅在运行时分配。而且因为在编译期间你不知道它的类型,你必须使用wildcard generic。因此,当您执行代码时,您只知道类型。

因此,您可以看到在执行代码时无法使用您收集的信息来帮助您编写

我强烈建议您阅读Oracle的tutorial on generics

第二部分

  

我是否需要为每个单独的案例写出方法?

我和保罗在一起。我相信我们可以帮到你,但你应该让我们知道你想要完成的任务。

...

根据您的评论,我认为以下是一个很好的解决方案。

您的现实模型包括各大洲,国家和城市。因此,您应该拥有课程ContinentCountryCity。由于您在对人口进行建模,因此所有人都应该使用方法getPopulation()。这是他们共同的一件事;所有这些东西都填充了。在Java中解决这种常见结构/行为的方法是使用方法Populated创建一个接口(让我们称之为getPopulation())并让所有这些类实现它:

public interface Populated {

    int getPopulation();

}

public class Country implements Populated {

    @Override
    public int getPopulation() {
        ...
    }

}

// same for Continent and City

现在你有三个班级但是他们都可以被视为一件事,因为他们被填充了。例如,您可以在列表中收集它们:

List<Populated> populated = new ArrayList<>();
populated.add(new Country());
populated.add(new City());
...

此列表可以使用比较器进行排序,该比较器适用于Populated

的实例
public class PopulationComparator implements Comparator<Populated> {

    public int compare(Populated left, Populated right) {
        return left.getPopulation() - right.getPopultion();
    }

}