Java 关于匿名类的问题(确切错误是什么) publicstaticvoidmain(字符串[]args){ 列表=新的ArrayList(); 列表。添加(“机器人”); 添加(“苹果”); 列表。添加(“方框”); StrComp cmp=新StrComp(){ @凌驾 公共整数比较(字符串s1、字符串s2){ 返回s1.length()-s2.length(); } }; 集合。排序(列表,cmp); }

Java 关于匿名类的问题(确切错误是什么) publicstaticvoidmain(字符串[]args){ 列表=新的ArrayList(); 列表。添加(“机器人”); 添加(“苹果”); 列表。添加(“方框”); StrComp cmp=新StrComp(){ @凌驾 公共整数比较(字符串s1、字符串s2){ 返回s1.length()-s2.length(); } }; 集合。排序(列表,cmp); },java,Java,“StrComp cmp=new StrComp()”上有错误。我所做的只是在教科书中输入代码解释匿名类。。有什么问题吗???我假设您在教科书中遗漏了什么,java中没有类或接口名称StrCmp,您也没有定义它,所以它会引发以下错误 public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Robot");

“StrComp cmp=new StrComp()”上有错误。我所做的只是在教科书中输入代码解释匿名类。。有什么问题吗???

我假设您在教科书中遗漏了什么,java中没有类或接口名称
StrCmp
,您也没有定义它,所以它会引发以下错误

public static void main(String[] args) {
    
    List<String> list = new ArrayList<>();
    list.add("Robot");
    list.add("Apple");
    list.add("Box");
    
    StrComp cmp = new StrComp() {
        @Override
        public int compare (String s1, String s2) {
            return s1.length() - s2.length();
        }
    };
    
    Collections.sort(list,cmp);
}
正确的代码是为匿名类使用
比较器
接口

error: cannot find symbol
    StrComp cmp = new StrComp() {
    ^
  symbol:   class StrComp
比较器cmp=新比较器(){ @凌驾 公共整数比较(字符串s1、字符串s2){ 返回s1.length()-s2.length(); } };
顾名思义,匿名类构造创建了一个匿名类型—一个没有名称的类型。这不是一个“选择一个名字,并定义它的飞行”的情况

在代码中,您有一个类型;您使用名为
StrComp
的类型。这一结构将:

  • 声明类型为
    StrComp
    的新变量(意思是:仅限于引用
    null
    或引用StrComp的实例或StrComp的子类型)
  • 创建一个新的匿名StrComp子类型,该子类型是通过扩展StrComp并添加您编写的compare方法创建的
  • 实例化此无名类型的新实例
  • 将其分配给
    cmp
    变量
如果StrComp还不存在,那么这些都没有多大意义。此构造用于扩展现有类型

正如前面的评论所说:您可能打算覆盖
Comparator
,因此:

Comparator cmp = new Comparator<String>() {
        @Override
        public int compare (String s1, String s2) {
            return s1.length() - s2.length();
        }
    };
    
比较器cmp=新比较器(){ ... } 但请注意:这是过时的java,已经过时多年了。告诉你的老师学习一些新的java,或者买一本新书

您现在可以执行以下操作:

Comparator<String> cmp = new Comparator<String>() {
   ...
}
比较器cmp=(s1,s2)->s1.length()-s2.length();
您尚未发布StrCmp的定义。为了消除错误,您需要定义如下内容

Comparator<String> cmp = (s1, s2) -> s1.length() - s2.length();
使用: 标准的功能界面,使您更容易以简洁的方式进行操作

[Box, Robot, Apple]
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.List;
公共班机{
公共静态void main(字符串[]args){
列表=新的ArrayList();
列表。添加(“机器人”);
添加(“苹果”);
列表。添加(“方框”);
比较器cmp=(s1,s2)->s1.length()-s2.length();
集合。排序(列表,cmp);
系统输出打印项次(列表);
}
}

没有名为StrComp的类或接口。你指的是比较器,如果你不告诉我们错误,我们怎么知道出了什么问题?
[Box, Robot, Apple]
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Robot");
        list.add("Apple");
        list.add("Box");

        Comparator<String> cmp = (s1, s2) -> s1.length() - s2.length();

        Collections.sort(list, cmp);
        System.out.println(list);
    }
}