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

java – 无法编译实现没有类型参数的接口的类

发布时间:2020-12-14 23:48:03 所属栏目:Java 来源:网络整理
导读:我有以下测试代码: public interface ContainerI { public void addClass(Class? clazz);}public class MyContainer implements Container { public void addClass(Class? clazz) {}} 尝试编译这两个类时,我收到以下错误: MyContainer.java:1: MyContainer
我有以下测试代码:
public interface Container<I> {
    public void addClass(Class<?> clazz);
}

public class MyContainer implements Container {
    public void addClass(Class<?> clazz) {}
}

尝试编译这两个类时,我收到以下错误:

MyContainer.java:1: MyContainer is not abstract and does not override abstract method addClass(java.lang.Class) in Container

如果我在MyContainer中向Container接口添加一个类型(例如< Object>),我就不会收到错误.

问题是我将类型参数引入到Container,它是公共API的一部分,因此为了兼容性,我不能让所有实现类都无法编译.

有人有主意吗?这是类型擦除问题吗?有解决方法吗?

解决方法

我认为问题在于,如果你在类声明中的任何地方使用原始类型,那么你就会选择退出泛型.所以这将工作 – 请注意参数更改.
public class MyContainer implements Container {
    public void addClass(Class clazz) {}
}

从section 4.8 of the JLS开始:

The superclasses (respectively,
superinterfaces) of a raw type are the
erasures of the superclasses
(superinterfaces) of any of its
parameterized invocations.

我相信这是相关的一点…… Container< T> .addClass(Class<?> clazz)的删除是addClass(Class clazz).

但是,基本上除非这是真正的遗留代码,否则您应该将类??型参数引入接口作为重大变化.

(编辑:李大同)

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

    推荐文章
      热点阅读