如果你有一个名为A的接口,它有一个名为print的方法签名;现在,如果您有3个实现A的类,并且您调用A.print,您如何知道调用哪个类方法。没有新的对象
public interface A()
{
public void print(){}
}
@Component
public class B implements A
{
public void print()
{
system.out.print("B");
}
}
@Component
public class c implements A
{
public void print()
{
system.out.print("C");
}
}
@Component
public class d implements A
{
public void print()
{
system.out.print("d");
}
}
public class runner()
{
@Autowired
private A aThing_;
aThing_.print();
}
答案 0 :(得分:3)
接口定义了交互契约,换句话说,定义了实现该接口的每个类应该提供的一组方法。
Oracle对问题的回答是What's an Interface?:
正如您已经了解的那样,对象定义了它们与之的交互 外面的世界通过他们揭露的方法。方法形成 对象与外界的接口;前面的按钮 例如,你的电视机是你和你之间的接口 塑料外壳另一侧的电线。您 按“电源”按钮打开和关闭电视。
调用取决于实现接口的对象的类型。
A interface = new B();
您将为B
界面中定义的print
方法调用print
A
方法的实现。
编辑:接口的关键是定义与对象的交互,而不管其实际类型如何。该代码似乎是对同一界面背后的一组组件进行自动扫描,以表明您可以定义一组不同的组件,以便在给定上下文的情况下以不同的方式处理相同的情况。
AFAIK autowire默认为该字段的名称。您可以使用@Qualifier("CLASS_NAME_HERE")
注释以及@Autowire
来定义要注入的接口实现。
您可能需要查看this。
答案 1 :(得分:1)
它将从对象调用它的类中调用方法版本
A ob = new B();
ob.print()// will invoke method from B
A ob = new C();
ob.print()// will invoke method from C
查看强>
答案 2 :(得分:0)
取决于您如何实例化此类对象:
例如
private A aThing = new C();
将调用C
打印方法
答案 3 :(得分:0)
如果我正确理解了我们的例子,你就有了一个类Runner,对一个实现A的对象的引用是自动装配的。
界面的重点是多态性。换句话说,在此设计中使用接口A的目的是使Runner不需要知道正在使用哪个实现 - 所有Runner关心的是A上定义的方法是可用的。
你可以在A上设置一个属性,它返回某种类型的信息,但是(我相信有一些例外)会破坏部分目的。