我有一个静态方法需要调用 SportsMenComparator
。但是,众所周知,这是不允许的。静态函数如何使用比较器子类?尽管我有变通方法,但我正在寻找针对此特定问题的最佳实践。
final class SportsMan {
private final String name;
private final int rank;
private final String sport;
public SportsMan (String name, int rank, String sport) {
this.name = name;
this.rank = rank;
this.sport = sport;
}
public String getName() {
return name;
}
public int getRank() {
return rank;
}
public String getSport() {
return sport;
}
}
final class Sport {
private final String sport;
private final int numberOfPlayers;
public Sport(String sport, int numberOfPlayers) {
this.sport = sport;
this.numberOfPlayers = numberOfPlayers;
}
public String getSport() {
return sport;
}
public int getNumberOfPlayers() {
return numberOfPlayers;
}
}
public final class Joins {
private Joins () {}
public class SportsMenComparator implements Comparator<SportsMan> {
@Override
public int compare(SportsMan s1, SportsMan s2) {
return s1.getSport().compareTo(s2.getSport());
}
}
public static void innerJoinSort(List<SportsMan> sportsMans, List<Sport> sportList) {
Collections.sort(sportsMans, new SportsMenComparator());
}
}
Eclipse 导致以下消息:无法访问类型 Joins 的封闭实例
,其中 Joins 是封闭类的名称。
最佳答案
But this, as we all know is not allowed. How does a static function use a comparator subclass ?
您不能使用非静态引用
,但您仍然可以创建一个新对象并使用它。因此,由于您要创建一个新的 SportsMenComparator
对象并传递,所以没有问题。
例如:
public static void main(String[] args) {
List<String> s =new ArrayList<String>();
s.add(""); // allowed
}
但是
List<String> s =new ArrayList<String>();
public static void main(String[] args) {
System.out.println();
s.add(""); // Error: Cannot make a static reference to the non-static field s
}
编辑:
由于您在 Joins 中定义了比较器类,因此您需要 Joins 对象来访问其中的比较
Collections.sort(sportsMans, new Joins().new SportsMenComparator());
关于java - 静态方法如何使用比较器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20393524/