gpt4 book ai didi

java - 伪造的类型参数使程序无法编译

转载 作者:行者123 更新时间:2023-12-03 22:59:11 37 4
gpt4 key购买 nike

我在 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);
}
}

翻倒屏幕截图:

Incompatible types It's a Long! It's an Object!

当然,在实际项目中,“未使用”类型参数是在其他地方使用的实际类型参数,因此我不能直接删除它(这将是另一种将这种复制减少到编译程序的方法) )。我可以解决这个问题吗?

注意:从技术上讲,这种复制并不完全是最小的,因为可以删除 Unused 类,并且可以将“Object”用作类型参数。

最佳答案

您通过以下方式禁用了泛型类型参数:

    BaseClass myObject = new ChildImpl();

应该是

    BaseClass<Unused> myObject = new ChildImpl();

然后List<Long>只是成为对象列表。

正如 @ernest_k 评论的那样,我明白了。

关于java - 伪造的类型参数使程序无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59736165/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com