Java 为什么在这种情况下,重写Setter方法不起作用
关于标题,我很抱歉,因为我找不到更好的,所以任何编辑将不胜感激 考虑以下类别:Java 为什么在这种情况下,重写Setter方法不起作用,java,oop,inheritance,Java,Oop,Inheritance,关于标题,我很抱歉,因为我找不到更好的,所以任何编辑将不胜感激 考虑以下类别: public interface GlobalDashlet { public Collection<? extends GlobalDashletSetting> getSettings(); public void setSettings(Collection<? extends GlobalDashletSetting> settings); }
public interface GlobalDashlet {
public Collection<? extends GlobalDashletSetting> getSettings();
public void setSettings(Collection<? extends GlobalDashletSetting> settings);
}
public class Dashlet implements GlobalDashlet {
private Collection<DashletSetting> settings;
public Collection<DashletSetting> getSettings(){
return settings;
}
//This Wont Work
public void setSettings(Collection<DashletSetting> settings) {
this.settings = settings;
}
//This Will Work
public Collection<DashletSetting> getSettings(){
return settings;
}
}
public class DashletSetting implements GlobalDashletSetting {
}
公共接口GlobalDashlet{
公共集合,因为它有不同的签名
Collection
不是Collection,因为它有不同的签名
Collection
不是Collection,因为重写的方法不能限制输入变量的范围。原始方法可以接受扩展GlobalDashletSetting
类的任何内容,但重写的方法仅限于GlobalDashletSetting
类的一个子类,因为重写的方法无法限制输入变量的范围。原始方法可以接受扩展GlobalDashletSetting
类的任何内容,但重写的方法仅限于GlobalDashletSetting
class的一个子类,原因是返回类型可能是
重写方法时,始终可以返回更具体的类型(即子类型)。下面是一个更容易理解的示例:
class NumberProvider {
Number getNumber() { return 1.23; }
}
class IntegerProvider extends NumberProvider {
// Returning a more specific type when overriding:
@Override
Integer getNumber() { return 42; }
}
类型Collection
是Collection的适当子类型,原因是返回类型可能是
重写方法时,始终可以返回更具体的类型(即子类型)。下面是一个更容易理解的示例:
class NumberProvider {
Number getNumber() { return 1.23; }
}
class IntegerProvider extends NumberProvider {
// Returning a more specific type when overriding:
@Override
Integer getNumber() { return 42; }
}
类型Collection
是Collection的一个适当的子类型,它不能解释覆盖为什么对getter有效。您需要覆盖确切的签名,而不是它的一部分。
不能解释它吗?因为java就是这样工作的OP清楚地问为什么它对getter有效而对setter无效。“您需要覆盖确切的签名"没有解释为什么可以用不同的返回类型重写。不能用返回字符串的方法重写返回整数的方法。但是可以重写返回CollectionIt’s的方法getter和setter是不同的,因为covarience和contravarience。这并不不同。它们都是方法。java使用重写的ethod签名。这不能解释重写为什么对getter有效。您需要重写确切的签名,而不是它的一部分。
没有解释它?因为java就是这样工作的OP清楚地问为什么它对getter有效而对setter无效。“您需要重写确切的签名”没有解释为什么可以用不同的返回类型重写。不能用返回字符串的方法重写返回整数的方法。但是可以重写返回CollectionIt’s的方法getter和setter是不同的,因为covarience和contravarience。这并不不同。它们都是方法。java使用重写的方法签名。我有同样的问题我有同样的问题你如何用这种推理解释getter方法的行为?从java 5及以上版本开始,重写时允许使用方法的返回类型。你如何用这种推理解释getter方法的行为?从java 5及以上版本开始,co variant
重写hanks时允许返回方法类型。虽然@Pranalee先回答,但您的答案更完整。尽管@Pranalee先回答,但您的答案更完整