0
public CountryComponent(String sorter)throws IOException
{
    String sort = sorter;
    getData(); 
    Collections.sort(countriesList, new sort());

}

基本上在我的 FrameViewer 类中,我为不同的排序方法提供了一个选项菜单,我坚持如何将不同比较器的类名作为参数传递

以上是我的测试。但是 .sort(ob,comparator) 期望它是比较器类的名称

我最初只是要在传递字符串时手动输入特定的类名

前任:CountryComponent canvas = new CountryComponent(PopSorter);

然后我希望它最终会成为Collections.sort(countriesList, new PopSorter());

我看到了一些关于 instanceOf 的东西,但我真的不明白,我不太确定他们想要做的正是我想要做的

4

3 回答 3

3

不要传递您以后要使用的分类器的类名。也不要通过课程,因为您不知道如何实例化它。传递排序器的一个实例:

SomeSpecificSorter sorter = new SomeSpecificSorter()
CountryComponent cc = new CountryComponent(sorter);

在 CountryComponent 类中:

private Comparator<Country> sorter;

public CountryComponent(Comparator<Country> sorter) throws IOException {
    this.sorter = sorter;
    getData(); 
    Collections.sort(countriesList, sorter);
}
于 2013-11-12T22:35:17.553 回答
1

传递类,然后你可以使用 newInstance (假设为空构造函数)

public CountryComponent(Class<? extends Comparator> sorterClass)throws IOException
{
        String sort = sorter;
        getData(); 
        Collections.sort(countriesList, sorterClass.newInstance());
}
于 2013-11-12T22:33:22.337 回答
0

作为参数定义,您应该使用

public CountryComponent(Class sorter) {
  Object o = sorter.newInstance() ; // to call the default constructor
}

并通过调用它CountryComponent canvas = new CountryComponent(PopSorter.class);

另一种选择是

public CountryComponent(String className) {
  Class sorter = Class.forName(className);
  Object o = sorter.newInstance() ; // to call the default constructor
}

并通过调用它CountryComponent canvas = new CountryComponent("yourpackages.PopSorter");

于 2013-11-12T22:34:33.607 回答