加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 当接口A在其方法签名中定义接口B时

发布时间:2020-12-14 05:54:02 所属栏目:Java 来源:网络整理
导读:…如何限制A的实现在方法签名中使用B的某个实现? 用例 这是一个Unit接口和两个实现它的枚举: public interface Unit { ... }public enum ForceUnit implements Unit { ... }public enum MassUnit implements Unit { ... } 属性界面使用哪个: public inter
…如何限制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
> Mass在setUnit签名中只使用MassUnit

当我尝试这样做,Eclipse抱怨:

The type Mass must implement the inherited abstract method Property.setUnit(unit)

并及时提出两个快速修复:

>使类抽象,这不是一个选项,因为我想要能够像Mass mass = new Mass();
>使用@Override注释添加未实现的方法.我不知道这是否是正确的解决方案,但对我来说这个笨拙的笑容.

问题

>我需要实现什么选择?仿制药的使用在这里有帮助吗?
为什么把类标记为抽象的方式来解决问题?

解决方法

你可以使用泛型
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.

Why does marking the class as abstract resolve the issue?

使类抽象意味着setUnit(Unit)实际上并没有被实现,但是对于抽象类,这是可以的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读