2014-02-19 64 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

相關問題