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)实际上并没有被实现,但是对于抽象类,这是可以的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |