StringBuilder和CharSequence不兼容

时间:2015-08-30 20:17:36

标签: java

我是Java语言的初学者,现在正在学习Oracle Java教程,以便更深入地了解这门语言。当我正在研究界面部分时,我在尝试练习时感到困惑:

“编写一个实现java.lang包中的CharSequence接口的类。你的实现应该向后返回字符串。选择本书中的一个句子作为数据。写一个小的主要方法来测试你的class;确保调用所有四种方法。“

当我这样做时,我发现了一些奇怪的东西。首先,我下载java.lang.CharSequence接口源代码并将其作为接口文件添加到我的主目录中,我对'subSequence'的实现抱怨StringBuilder无法转换为CharSequence类型。

以下是代码:

public CharSequence subSequence(int start, int end) {
    if (start < 0) {
        throw new StringIndexOutOfBoundsException(start);
    }
    if (end > s.length()) {
        throw new StringIndexOutOfBoundsException(end);
    }
    if (start > end) {
        throw new StringIndexOutOfBoundsException(start - end);
    }
    StringBuilder sub = 
        new StringBuilder(s.subSequence(fromEnd(end), fromEnd(start)));
    return sub.reverse();
}

但是当我删除我的CharSequence接口的本地文件时,java编译器发现我正在实现'java.lang.CharSequence'接口而不是本地包,然后编译错误消失。

对此感到好奇。本地接口文件和库接口文件之间有什么区别?什么原因导致编译错误?

2 个答案:

答案 0 :(得分:3)

没有“本地接口文件”这样的东西。

您创建了一个全新的,不相关的接口,恰好与JRE中的接口具有相同的名称。

您可以直接从包中使用JRE中定义的类型,而无需下载任何内容。

答案 1 :(得分:1)

理论上,您可以创建自己的类或接口,其名称与已存在于JRE中的名称相同。

您甚至可以在名为java.lang的包中创建它。

但是当Java想要检查类型兼容性时,它会检查几件事情:

  1. 名称相同
  2. 包装是相同的
  3. 类加载器是相同的
  4. 如果您实际将CharSequence的包设置为java.lang,那么在运行时,当它检查StringBuilder对象时,它会从java.lang.CharSequence查找java.lang.StringBuilder加载java.lang.CharSequence本身的类加载器。您的CharSequence未被同一个类加载器加载,因此它的类型不同。

    但是,如果您的错误是在编译器级别,那么可能意味着您已将java.lang.CharSequence放在具有不同名称(或默认包)中的包中。否则,它可能在编译时保持沉默。

    编辑:事实上,似乎在运行时&#34;本地&#34; do{ try{ System.out.println("Choose your option"); System.out.println(" 1. Create List of used car"); System.out.println(" 2. Print list of used car"); System.out.println(" 3. Search "); System.out.println(" 4. Exit"); int choose = read.nextInt(); if ( choose <= 4){ throw new Exception(); } }catch (Exception e){ System.out.println("Please enter input option from 1-4"); ..rest of code... }while(choose <= 4); 甚至没有加载,而编译器可以看到它。