我有一个名为Functions的接口,但没有定义任何方法。然后我有一个实现该接口的实现类,并且还有一个在实现类中定义的方法。如果我创建接口类型的变量并为其分配实现类型的新实例(其中定义了一个方法)。为什么我不能从变量中访问该方法?我想我在这里遗漏了一些东西。我的印象是,如果为接口类型的变量分配了一个实现类型的实例,该实例类型中定义了一个方法,那么该变量可用于运行该方法。
请指教。提前谢谢。
答案 0 :(得分:2)
从概念上讲,你在这里做错了。
如果要调用“that method”,则应使用实现类型的变量,而不是接口类型。
或者,如果“那个方法”确实属于界面的预期功能,那么你应该将它“向上”移动到界面。
答案 1 :(得分:1)
您只能使用Reference类型定义的方法,而不是Instance类型,例如:
AutoClosable a = new PrintWriter(...);
a.println( "something" );
此处,AutoClosable是引用类型,PrintWriter是实例类型。
此代码将给出编译器错误,因为AutoClosable中定义的唯一方法是close()
。
答案 2 :(得分:0)
你不能这样做,请考虑这个例子:
interface Foo {
}
上课:
class FooBar implements Foo {
public void testMethod() { }
}
class FooBarMain {
public static void main(String[] args) {
Foo foo = new FooBar();
//foo.testMethod(); this won't compile.
}
}
因为在编译时,编译器不会知道您正在创建new FooBar();
,并且它有一个名为testMethod()
的方法,它将动态确定。因此,它希望您通过接口变量访问的任何内容都应该在您的界面中可用。
您可以做的是如果您想通过接口变量访问该方法,最好将该方法移动到接口并让客户端实现它。
如果您对此有疑问,请告诉我。
答案 3 :(得分:0)
据我所知,您的问题如下:
// Interface with no methods
public interface Functions {
}
// Implementation class with a method defined in it
public class Implementation implements Functions {
public void foo() {
System.out.println("Foo");
}
}
public class Main {
public static void main(String[] args) {
// Create a variable from the interface type and
// assign a new instance of the implementation type
Functions f = new Implementation();
// You try to call the function
f.foo(); // This is a compilation error
}
}
这是正确的行为,这是不可能的。因为编译器看到变量f
具有({静态)类型Functions
,所以它只能看到该接口中定义的函数。编译器不知道变量是否实际包含对Implementation
类的实例的引用。
要解决此问题,您应该在界面
中声明方法public interface Functions {
public void foo();
}
或使您的变量具有实现类的类型
Implementation f = new Implementation();