2014-02-19 65 views
0

我一直在试图通过一个对象的字段来创建一个比较器,而且我似乎无法将比较器的类型转换为我想要的。是否可以创建基于动态类型的比较器?

我试图做这样的事情:

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

}; 

是可能的,或者我需要写出来供每一个人类情况的方法是什么?

+0

你能解释这里的大问题?你试图做的事情不会奏效,但目前还不清楚为什么你需要这样做。 –

+0

比较器是Interface,所以你如何在这里创建对象。 – Devavrata

+0

@Neuron通过创建该接口类型的匿名类。 –

回答

0

第一部分

是有可能[...]

不是你尝试它的方式。编译时间和运行时间会造成混淆,例如:

  • 泛型是Java中的纯编译时概念。实际上,编译期间删除了泛型(称为type erasure)。它只存在于编译前给你类型安全,也就是说写入你的代码。
  • 但实例type仅在运行时分配。而且因为在编译期间你不知道它的类型,所以你必须使用wildcard generic。所以你只知道类型,当你执行你的代码。

所以你可以看到,你不能使用,而执行您的代码,以帮助您它,你收集到的信息。

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

第二部分

将我需要写出来的每一个人类情况的方法是什么?

我与Paul在此。我相信我们可以帮助你,但你应该给我们一个你想要完成的事情的想法。

...基于您的评论

,我认为以下将是一个很好的解决方案。

您的现实模型由大洲,国家和城市组成。因此,您应该有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(); 
    } 

} 
+1

基本上,我试图比较几个不同的对象使用相同的机制作为一个工具来排序列表Collections.sort.The对象是诸如一个国家,城市和大陆的人口。我试图编写一种方法,可以在country.population或city.population中取决于用户选择何种数据进行排序和打印。 – Strategos

相关问题