我在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所评论的那样。