我一直在尝试通过对象的字段创建比较器,而我似乎无法将比较器的类型转换为我想要的类型。
我正在尝试做这样的事情:
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)
有可能[...]?
不是你尝试它的方式。你的编译时间和运行时间都很混乱,即:
type
仅在运行时分配。而且因为在编译期间你不知道它的类型,你必须使用wildcard generic。因此,当您执行代码时,您只知道类型。因此,您可以看到在执行代码时无法使用您收集的信息来帮助您编写。
我强烈建议您阅读Oracle的tutorial on generics。
我是否需要为每个单独的案例写出方法?
我和保罗在一起。我相信我们可以帮到你,但你应该让我们知道你想要完成的任务。
...
根据您的评论,我认为以下是一个很好的解决方案。
您的现实模型包括各大洲,国家和城市。因此,您应该拥有课程Continent
,Country
和City
。由于您在对人口进行建模,因此所有人都应该使用方法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();
}
}