我知道实现接口意味着什么(技术上),但我不确定我是否理解“合同”包含的内容:
假设我创建了一个实现MyList
的类java.util.List
(也就是说,我使用编译的代码实现所有方法),那么MyList
是List
吗?或者我是否需要阅读我覆盖的方法的所有注释,并确保我的实现满足这些行为的“期望”?
答案 0 :(得分:12)
从技术上讲,是的,如果select
..
......
where filter.product_id in
(select a.product_id from filter a where a.filter_id in (1,2))
AND filter.product_id in
(select a.product_id from filter a where a.filter_id in(4))
实现MyList
接口的所有方法,则List
为List
。但编译器不是魔术师。它无法检查您的方法是否应该执行它们应该执行的操作。当然,每种方法都应该按照文档的说法进行操作。
如果我收到List
,而此List
是MyList
的实例,并且我致电list.add("foo")
,我希望最后添加“foo”的清单。不被删除,或添加两次,或其他任何行为。因此,当然,如果您的类实现List
,其方法应符合其API文档中定义的合同。
想象一下你卖车。我去你的商店买车。对我来说,它是一辆汽车,因为它看起来像所有其他汽车:它有车轮,踏板,车窗等。但是,如果我按下加速器,它会刹车,当我打开灯时,它鸣喇叭,当我打开窗户,它加速并杀死一个可怜的孩子在路上,我一点也不开心,你会遇到麻烦,因为你卖给我的车行为不正确。
答案 1 :(得分:2)
在Java中,类和接口之间的区别在于类具有方法实现。界面没有。所以一个接口可能有一个add()方法,但是没有说明add的工作方式。一个类需要定义添加的工作方式。
当您将implements InterfaceName
放入类定义时,就会实现一个界面。然后,您必须定义接口的所有方法,否则您的应用程序将无法编译。那么是的,说MyClass是一个MyInterface是正确的 - 你甚至可以去MyInterface interface = new MyClass();
是的,您应该阅读所有注释并确保您的类以预期的方式实现接口。否则你最终会得到一些编译但可能无法正常工作的东西。
答案 2 :(得分:1)
接口是合同的必要最低要求:正如您所说,如果不编译,您就无法履行合同!但是语言可能无法定义和限制界面的全部要求,所以你也应该注意这些期望。
一个简单的例子是ICloneable
接口。如果您所做的只是实施
public MyObject clone() {
return (MyObject)super.clone();
} // clone()
那时你已经完成了语言合同,也许你的班级合同也是如此。但是,如果您的课程中包含List
,那么您会惊讶于您的用户:“那不是clone()
正确!”
合同还包括用户期望。打破他们,虽然语言律师可能会说你的班级是List
,其他人不同意..
答案 3 :(得分:0)
是MyList a List?
为了回答这个问题,您首先需要了解哪些接口做了什么或者为它们编写了什么......
不要忘记界面可以为你提供一个非常重要的分离可以做什么和如何他们做... 所以技术上实现一个界面并不是要问一个对象是某种东西,而是更多地要求如何一个对象可以做某事
所以当你说List myContainer = new ArrayList(); 你正在定义一个可以完成列表可以做的所有事情的对象...... 添加,删除,获取等等
你可以说它是一个列表,我会说它可以做列表可以做的事情..