gpt4 book ai didi

java - 泛型类中的广泛类型删除

转载 作者:行者123 更新时间:2023-11-30 06:41:39 25 4
gpt4 key购买 nike

有一段时间我以为我了解类型删除和泛型类型是如何工作的,但今天我偶然发现了在类中使用泛型类型并且意外的类型删除发生在与泛型无关的类型上的情况。考虑以下示例类:

import java.util.Optional;

class TheClass<T> {
Optional<Something> getSomething() {
return Optional.of(new Something());
}

class Something {
int getId() {
return 1;
}
}
}

值得注意的是,它具有根本不被使用的泛型。类用法如下:

public class Main {
private static TheClass clazz = new TheClass<>();

public static void main(String[] args) {
clazz.getSomething().ifPresent(s -> System.out.println(((TheClass.Something) s).getId()));
}
}

clazz.getSomething().ifPresent 产生警告(对 ifPresent 的未经检查的调用)和内部调用 if present cast is needed。如果从抽象类中删除泛型 T,则代码将按预期工作而不会发出警告和强制转换。

观察到的行为的原因是什么?为什么 javac 似乎听取了 TheClass 的所有类型?是否有任何解决方法来避免转换参数和抑制 uchecked 警告?

最佳答案

问题是您的clazz 静态实例仍然是原始的

即使您指定了菱形运算符,编译器也无法计算泛型类型,因为左侧是原始的。

原始类失去了所有泛型。您可以有两种选择。

  1. 在这种情况下使用特定类型,Something(但是,您必须将其声明为静态的,因为您在静态上下文中引用它)。对于这个练习,我将 Something 类设为静态,
  static class Something {
int getId() {
return 1;
}
}
    private static TheClass<Something> clazz = new TheClass<>();

public static void main(String[] args) {
clazz.getSomething().ifPresent(s -> System.out.println(s.getId()));
}
  1. 或者用通配符作为MC Emperor的答案。

关于java - 泛型类中的广泛类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873845/

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