java – 当接口A在其方法签名中定义接口B时
|
…如何限制A的实现在方法签名中使用B的某个实现?
用例 这是一个Unit接口和两个实现它的枚举: public interface Unit { ... }
public enum ForceUnit implements Unit { ... }
public enum MassUnit implements Unit { ... }
属性界面使用哪个: public interface Property {
public void setUnit( Unit unit ); // for example
}
public class Force implements Property { ... }
public class Mass implements Property { ... }
在这里我想要能够执行: > Force在setUnit签名中只使用ForceUnit 当我尝试这样做,Eclipse抱怨:
并及时提出两个快速修复: >使类抽象,这不是一个选项,因为我想要能够像Mass mass = new Mass(); 问题 >我需要实现什么选择?仿制药的使用在这里有帮助吗? 解决方法
你可以使用泛型
public interface Property<U extends Unit> {
public void setUnit(U unit ); // for example
}
public class Force implements Property<ForceUnit> {
@Override
public void setUnit(ForceUnit unit) { }
}
public class Mass implements Property<MassUnit> {
@Override
public void setUnit(MassUnit unit) { }
}
注意:这的确意味着你仍然可以做 Property raw = new Mass(); raw.setUnit(ForceUnit.NEWTON); // ClassCastException 然而,这将导致类转换异常,因为编译器无法在运行时检查原始类型. 你应该做的是 Property<Mass> raw = new Mass(); raw.setUnit(ForceUnit.NEWTON); // doesn't compile.
使类抽象意味着setUnit(Unit)实际上并没有被实现,但是对于抽象类,这是可以的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
