Java 为什么我会有多余的东西? 公共类SortAnimal { 公共静态比较器getAnimalTagComparator() { 返回getAnimalTagComparator(); } 类getAnimalTagComparator实现Comparator{ @凌驾 公共整数比较(动物o1,动物o2){ 返回o1.getTag()-o2.getTag(); } }

Java 为什么我会有多余的东西? 公共类SortAnimal { 公共静态比较器getAnimalTagComparator() { 返回getAnimalTagComparator(); } 类getAnimalTagComparator实现Comparator{ @凌驾 公共整数比较(动物o1,动物o2){ 返回o1.getTag()-o2.getTag(); } },java,Java,我有另一个文件生成数组并调用: public class SortAnimal { public static Comparator<Animal> getAnimalTagComparator() { return getAnimalTagComparator(); } class getAnimalTagComparator implements Comparator<Animal> { @Override

我有另一个文件生成数组并调用:

public class SortAnimal
{
    public static Comparator<Animal> getAnimalTagComparator()
    {
        return getAnimalTagComparator();
    }

class getAnimalTagComparator implements Comparator<Animal> {

    @Override 
    public int compare(Animal o1, Animal o2) {
        return o1.getTag()-o2.getTag();         
    }
}
比较器getAnimalTagComparator=SortAnimal.getAnimalTagComparator();
为什么我会在这一行上得到stackoverflow:返回getAnimalTagComparator();

getAnimalTagComparator()
递归调用自身无限次(或者至少直到堆栈溢出)。这会导致堆栈溢出

您应该为类和方法使用不同的名称,并将方法更改为类似以下内容:

Comparator<Animal> getAnimalTagComparator = SortAnimal.getAnimalTagComparator();
公共静态比较器getAnimalTagComparator()
{
返回新的AnimalTagComparator();
}

并将类更改为
静态类AnimalTagComparator
。(静态修饰符是必需的,因为
AnimalTagComparator
类嵌套在
SortAnimal
类中,在不使其静态的情况下,您需要
SortAnimal
的封闭实例才能创建
AnimalTagComparator
)的存在。

getAnimalTagComparator()
递归调用自身无限次(或至少直到堆栈溢出)。这会导致堆栈溢出

您应该为类和方法使用不同的名称,并将方法更改为类似以下内容:

Comparator<Animal> getAnimalTagComparator = SortAnimal.getAnimalTagComparator();
公共静态比较器getAnimalTagComparator()
{
返回新的AnimalTagComparator();
}

并将类更改为
静态类AnimalTagComparator
。(静态修饰符是必需的,因为
AnimalTagComparator
类嵌套在
SortAnimal
类中,在不使其静态的情况下,您需要一个
SortAnimal
的封闭实例来创建
AnimalTagComparator
的存在。)

因为您的代码只是在调用自己(您正在调用递归方法)。 由于此调用没有终止,因此最终会出现StackOverflow错误

public static Comparator<Animal> getAnimalTagComparator()
{
    return new AnimalTagComparator();
}
公共静态比较器getAnimalTagComparator()
{
return getAnimalTagComparator();//是,这就是这个方法
}
如果你想给另一个班打电话,你可以这样做

public static Comparator<Animal> getAnimalTagComparator()
{
    return getAnimalTagComparator();  // yes this is THIS method
}
公共静态比较器getAnimalTagComparator()
{
返回新的getAnimalTagComparator();
}

因为您的代码只是在调用自身(您正在调用递归方法)。 由于此调用没有终止,因此最终会出现StackOverflow错误

public static Comparator<Animal> getAnimalTagComparator()
{
    return new AnimalTagComparator();
}
公共静态比较器getAnimalTagComparator()
{
return getAnimalTagComparator();//是,这就是这个方法
}
如果你想给另一个班打电话,你可以这样做

public static Comparator<Animal> getAnimalTagComparator()
{
    return getAnimalTagComparator();  // yes this is THIS method
}
公共静态比较器getAnimalTagComparator()
{
返回新的getAnimalTagComparator();
}

为什么不?那一行是做什么的?为什么不?那一行是做什么的?建议将类的名称更改为更有用的名称会更好。当我尝试添加新的时,我遇到另一个错误:无法访问SortAnimal类型的封闭实例。必须使用SortAnimal类型的封闭实例限定分配(例如x.new A(),其中x是SortAnimal的实例)。为什么要将其作为嵌入式类?请尝试重新查看比较器示例。建议将该类的名称更改为更有用的名称会更好。当我尝试添加新类时,我遇到另一个错误:无法访问SortAnimal类型的封闭实例。必须使用SortAnimal类型的封闭实例限定分配(例如x.new A(),其中x是SortAnimal的实例)。为什么要将其作为嵌入式类?请尝试重新查看比较器示例。我刚刚尝试添加new并将名称更改为其他名称,但现在我遇到了以下错误:当我尝试添加new时,我遇到了另一个错误:无法访问SortAnimal类型的封闭实例。必须使用Sor类型的封闭实例限定分配tAnimal(例如x.new A(),其中x是SortAnimal的实例).@AlldaRage查看我的编辑-将AnimalTagComparator类设置为静态,这样就不需要封闭实例。我刚刚尝试添加新实例并将名称更改为其他名称,但现在我遇到了以下错误:当我尝试添加新实例时,我遇到了另一个错误:无法访问SortAnimal类型的封闭实例。必须使用SortAnimal类型的封闭实例(例如,x.new A(),其中x是SortAnimal的实例)。@AlldaRage查看我的编辑-将AnimalTagComparator类设为静态,您不需要封闭实例。