Tag: 方法 重写

一般用Java覆盖一个方法

如果我有这样的基类,我无法改变: public abstract class A { public abstract Object get(int i); } 我尝试用这样的B类扩展它: public class B extends A{ @Override public String get(int i){ //impl return “SomeString”; } } 一切都好。 但是如果我尝试的话,我试图让它更通用的失败: public class C extends A{ @Override public T get(int i){ //impl return (T)someObj; } } 我想不出有什么理由不应该被禁止。 根据我的理解,generics类型T绑定到一个Object – 它是A的请求返回类型。 如果我可以将String或AnyObject作为我的返回类型放在B ,为什么我不允许在我的C类中放入 T ? 从我的观点来看,另一种奇怪的行为是这样的另一种方法: public […]

在重写generics类的方法时的名称冲突

我试图通过以下代码了解我得到的名称冲突错误: import java.util.*; import javax.swing.*; class Foo { public void doSomething(Number n, Map comps) { } } class Bar extends Foo { public void doSomething(Number n, Map comps) { } } 错误信息: 错误:名称冲突: Bar doSomething(Number,Map)和Foo中的doSomething(Number,Map)具有相同的擦除,但都没有覆盖其他 我知道我可以通过从Foo删除generics类型,或者通过将Bar声明更改为class Bar extends Foo来修复它; 我想知道的是为什么在特定情况下会发生此错误,但如果我从每个方法中删除comps参数就会消失。 我已经完成了关于类型擦除的一些阅读,但在我看来,这两种方法在使用或不使用generics时都应该具有相同的擦除,因此在任何一种情况下都是有效的覆盖。 (请注意,我还没有在任何地方使用generics参数,这就是为什么我很惊讶。) 我知道我之前已经向父类添加了generics类型,但只获得了有关子类的警告,而不是错误。 有谁能解释这个场景?

在Java中,如果返回类型分别是基元及其包装类,是否可以重写方法?

在使用Java中重写和重写方法的想法时,我注意到这些方法的返回类型有一些灵活性。 这里有一点理论:“派生类中重写方法的返回类型可以是相同的,或者是基类中重写方法的返回类型的子类。这种重写方法的返回类型是已知的作为协变回归类型。“ 下面的例子假设B扩展A. Method in A: public Object some_method() {….} Method in B: public Integer some_method() {….} 因此,我们看到B中的some_method()会覆盖A中的some_method(),因为Integer是Object的子类。 我想知道是否存在以下灵活性以及以下是否因为自动装箱和拆箱而正确工作: Method in A: public Integer some_method() {….} Method in B: public int some_method() {….} 要么 Method in A: public int some_method() {….} Method in B: public Integer some_method() {….}