我有一个名为CacheRequestWrapper的类,它有一个带有泛型类型的字段.它还有另一个Optional<Long>型字段.当类成为泛型时,此可选字段的值将不再是Long类型.相反,它将成为Object型.

换句话说,当我将类设置为泛型时,泛型类型Optional被删除,我不明白为什么.只有字段cacheReturnValue应该是T类型,但似乎T类型也被分配给了Optional.让我用下面的例子来解释为什么会出现这种情况:

public class CacheRequestWrapper<T> extends CacheWrapper {

    private T cacheReturnValue;

    private Optional<Long> requestingUserId;

    public Optional<Long> getRequestingUserId() {
       return requestingUserId;
    }

    public void setRequestingUserId(Optional<Long>requestingUserId) {
       this.requestingUserId = requestingUserId;
    }
    
    //other Getters, setters
    
}


class Service{
    //1.
    private void myRawTypedMethod(CacheRequestWrapper cacheRequestWrapper) {

        Long viewerId = cacheRequestWrapper.getRequestingUserId().get(); //This gives the compile error 'required type: Long, provided type Object'

    }
    //2.
    private <T> void myGenericTypedMethod(CacheRequestWrapper<T> cacheRequestWrapper) {

        Long viewerId = cacheRequestWrapper.getRequestingUserId().get(); //No compile error here.

    }
}

在方法1.中,当我将可选值赋给viewerId时,我会得到一个编译错误.

那么为什么Optional字段的泛型类型会被泛型类型T覆盖呢?

推荐答案

此行为在Section 4.8 of the Java Language Specification中指定.没有类型参数的泛型类型称为原始类型,在原始类型中,almost all个泛型被删除.

原始类型仅用于与没有泛型的遗留Java代码(版本1.4或更低版本)交互,为了促进这种交互,所有泛型都需要删除,因为遗留代码可能希望执行泛型禁止的操作.

例如

String id = (String)wrapper.getRequestingUserId().orElseThrow();

如果不删除泛型,就不会编译.我承认,这是一个奇怪的例子,因为Optional是在泛型之后添加到Java语言中的,当然不会出现在遗留代码中,但Java并不例外.

由于1.4之前的java代码越来越少,新代码应该很少使用原始类型.

Java相关问答推荐

Java WireMock定义存根在Cucumber并行执行的多线程测试中失败

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

所有 case 一起输入时输出错误,而单独放置时输出正确

嵌入式ActiveMQ Artemis Web控制台加载错误

如何创建同一类的另一个对象,该对象位于变量中?

在运行MVN测试时,为什么构建失败,并显示了java.lang.ClassNotFoundException:java.net.http.HttpResponse?

GSON期间的Java类型擦除

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

允许同时执行两个方法,但不能同时执行这两个方法

Java组件项目中的JavaFX对话框国际化

TinyDB问题,无法解析符号';上下文&

我无法在我的Spring Boot应用程序中导入CSV依赖项

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

验证没有';t work on Hibernate Entity';s字段

如何设置默认序列生成器分配大小

如何在Selenium上继续使用最新的WebDriver版本

Spring Boot Security-每个端点都被403禁止,Spring记录一个BasicErrorController#错误(HttpServlet请求)

在JSON上获取反斜杠