我开始学习Java,第2行出现错误:" Small无法解析为类型"。为什么呢?
public class Big {
public Small getSmall() {
return new Small() {
void out() {
System.out.println("Big Small out()");
}
};
}
public static void main(String[] args) {
Big b = new Big();
Small s = b.getSmall();
s.out();
System.exit(0);
}
}
答案 0 :(得分:3)
public Small getSmall() {
return new Small() {
void out() {
System.out.println("Big Small out()");
}
};
}
似乎没有什么误解。声明匿名内部类时,假定Small为interface that you are implementing
或class that you are extending
。因此,如果您已经拥有Small类或接口,则需要导入它。如果没有创建一个。
答案 1 :(得分:0)
您获得的错误意味着编译器无法找到Small
类的声明。确保您已正确导入此类,或者此类具有适当的声明和/或位于主类所在的同一个包中。
答案 2 :(得分:0)
您无法使用匿名类从头开始创建类标识符。匿名类假定您正在扩展或实现另一个类或接口。但你可以做以下事情;
abstract class Small {} // Small declared here
public class Big {
public Small getSmall() {
// Create and return an anonymous class that extends Small.
return new Small() {
void out() {
System.out.println("Big Small out()");
}
};
}
public static void main(String[] args) {
Big b = new Big();
Small s = b.getSmall();
// Compile error below! Your Small reference doesn't know about out()
s.out();
System.exit(0);
}
}
当您创建匿名Small类时,您正在创建一个扩展 Small
的新(匿名)类。在上面的示例中,您将注意到抽象类Small
没有out()
方法。即使你可以在匿名声明中添加它,你也永远无法调用它,因为你仍然需要在Small
引用变量中保存新的匿名类。
或者,您可以创建一个扩展Object
的匿名类。但是它必须保存在Object
引用中,你只能从它调用对象方法。
我希望这会有所帮助。
进一步阅读;
答案 3 :(得分:0)
语法
return new Small() {
void out() {
System.out.println("Big Small out()");
}
};
可以被想象(粗略地)作为
的简短形式return new SmallWithOut();
有一个类
class SmallWithOut extends Small {
void out() {
System.out.println("Big Small out()");
}
}
你也可以把它翻译成单词
创建一个类的新实例,该类是类
Small
的子类(使用此out()
方法...)
问题在于您根本没有声明类Small
。所以应该在那里扩展的类根本就不知道。
有几种方法可以编译它。最简单的是在本地添加类作为内部类(甚至是接口)
public class Big
{
private static class Small
{
void out() {};
}
...
}
答案 4 :(得分:-1)
另一个类中的类,该类不提供类名,即该类是a java中的匿名内部