在我的一次访谈中,我被要求解释Interface和Abstract类之间的区别.
这是我的回答:
Java接口的方法是隐式抽象的,不能有实现.Java抽象类可以具有实现默认行为的实例方法.
在Java接口中声明的变量默认为final.抽象类可能包含非最终变量.
默认情况下,Java接口的成员是公共的.Java抽象类可以具有类似私有,受保护等类通常的类成员.
应使用关键字"implements"实现Java接口; 应使用关键字"extends"扩展Java抽象类.
接口只能扩展另一个Java接口,抽象类可以扩展另一个Java类并实现多个Java接口.
Java类可以实现多个接口,但它只能扩展一个抽象类.
然而,面试官并不满意,并告诉我这个描述代表了" 书本知识 ".
他告诉我一个更实际的回答,解释我何时会使用实际例子在界面上选择一个抽象类.
我哪里做错了?
所以,我的理解是以下不工作,但为什么不工作?
interface Adapter<E> {}
class Adaptulator<I> {
<E, A extends I & Adapter<E>> void add(Class<E> extl, Class<A> intl) {
addAdapterFactory(new AdapterFactory<E, A>(extl, intl));
}
}
Run Code Online (Sandbox Code Playgroud)
该add()方法给出了一个编译错误,"当第一个绑定是一个类型参数时,无法指定任何其他绑定的适配器<E>"(在Eclipse中),或者"类型参数不能跟随其他边界"(在IDEA中),请选择.
很明显,你只是不允许在I那之前使用type参数&,那就是那个.(而且在你问之前,如果你改变它们就行不通,因为不能保证它I不是一个具体的类.)但为什么不呢?我查看了Angelika Langer的常见问题解答并找不到答案.
通常,当某些泛型限制看似随意时,这是因为您创建了一种类型系统无法实际执行正确性的情况.但我不知道哪种情况会破坏我在这里要做的事情.我可能会说它可能与类型擦除后的方法调度有关,但是只有一种add()方法,所以它不像是有任何歧义......
有人能为我证明这个问题吗?