我是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'接口而不是本地包,然后编译错误消失。
对此感到好奇。本地接口文件和库接口文件之间有什么区别?什么原因导致编译错误?
答案 0 :(得分:3)
没有“本地接口文件”这样的东西。
您创建了一个全新的,不相关的接口,恰好与JRE中的接口具有相同的名称。
您可以直接从包中使用JRE中定义的类型,而无需下载任何内容。
答案 1 :(得分:1)
理论上,您可以创建自己的类或接口,其名称与已存在于JRE中的名称相同。
您甚至可以在名为java.lang
的包中创建它。
但是当Java想要检查类型兼容性时,它会检查几件事情:
如果您实际将CharSequence
的包设置为java.lang
,那么在运行时,当它检查StringBuilder
对象时,它会从java.lang.CharSequence
查找java.lang.StringBuilder
加载java.lang.CharSequence
本身的类加载器。您的CharSequence
未被同一个类加载器加载,因此它的类型不同。
但是,如果您的错误是在编译器级别,那么可能意味着您已将java.lang.CharSequence
放在具有不同名称(或默认包)中的包中。否则,它可能在编译时保持沉默。
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);
甚至没有加载,而编译器可以看到它。