java - 伪造的类型参数使程序无法编译
问题描述
我在 Java 11 中遇到了一个问题(在 Intellij 和 Jenkins 中)并做了一个最小的复制。一位同事认为这是 Java 中的一个错误。
当然,以下编译:
public class Main {
public static class Unused {};
public interface BaseClass<T> {
Long pie();
}
public static class ChildImpl implements BaseClass<Unused> {
@Override
public Long pie() { return 3L; }
}
public static void main(String args[]) {
BaseClass myObject = new ChildImpl();
Long piece = myObject.pie();
}
}
但是为什么以下内容不能编译?
import java.util.Collections;
import java.util.List;
public class Main {
public static class Unused{};
public interface BaseClass<T> {
List<Long> pie();
}
public static class ChildImpl implements BaseClass<Unused> {
@Override
public List<Long> pie() { return Collections.singletonList(3L); }
}
public static void main(String args[]) {
BaseClass myObject = new ChildImpl();
Long piece = myObject.pie().get(0);
}
}
翻车截图:
当然,在实际项目中,“未使用”类型参数是在其他地方使用的实际类型参数,因此我不能直接删除它(这将是另一种将这种复制减少到可以编译的程序的方法)。我可以解决这个问题吗?
注意:从技术上讲,这种复制并不完全是最小的,因为可以删除 Unused 类,并且可以将“Object”用作类型参数。
解决方案
您通过以下方式禁用了泛型类型参数:
BaseClass myObject = new ChildImpl();
应该是
BaseClass<Unused> myObject = new ChildImpl();
然后List<Long>
就变成了一个对象列表。
正如@ernest_k 评论的那样,我看到了。
推荐阅读
- autohotkey - 如何在 AHK 中保留原始键绑定以及新键绑定?
- javascript - 如何在节点 js 的 POST 请求中重定向
- laravel - 无法通过 Controller 将变量传递到 Eloquent Query
- regex - 使用正则表达式确定顺子(无序手)
- java - Spock测试方法中无法加载Spring上下文
- java - 在 android 应用程序中更改语言的选项
- python - 如何使用 Python 的 requests 模块上传非 utf-8 编码的文件?
- azure - 如何列出 Azure 租户中的所有资源?
- python-3.x - Blackbaud CRM 的组成记录的 ContextRecordID 的正确格式是什么?(转换数据类型时出错)
- angular - Firebase图像URL不起作用Angular NgStyle