Java Optional<Long>调用get()返回Object类型不匹配问题排查
问题原因与解决方案
问题根源
在AssetResponse类中,你定义的asset字段和getAsset()方法返回的是原始类型AssetInterface,未指定泛型参数<T>。当使用原始泛型类型时,Java会触发泛型擦除机制,导致接口中getDuration()方法的返回值从Optional<Long>退化为原始的Optional,调用其get()方法时会返回Object类型,因此无法直接赋值给Long变量,出现类型不匹配错误。
修复方案
有两种适配不同场景的修复方式:
方式1:为AssetResponse指定具体泛型类型
如果AssetResponse中的asset始终是Asset类型(实现了AssetInterface<AssetV1>),可直接将字段和方法返回类型改为AssetInterface<AssetV1>:
public class AssetResponse { private AssetInterface<AssetV1> asset; public AssetInterface<AssetV1> getAsset() { return asset; } }
修改后,调用assetResponse.getAsset().getDuration().get()时,getDuration()会明确返回Optional<Long>,get()的结果即为Long类型,可直接赋值。
方式2:将AssetResponse定义为泛型类
如果AssetResponse需要适配不同的AssetInterface实现类,可把AssetResponse改为泛型类:
public class AssetResponse<T> { private AssetInterface<T> asset; public AssetInterface<T> getAsset() { return asset; } }
使用时指定泛型参数:
AssetResponse<AssetV1> response = ...; Long duration = response.getAsset().getDuration().get();
额外语法修正提示
你的代码存在几处基础语法错误,建议一并修正:
AssetResponse类定义多了括号:public class AssetResponse()应改为public class AssetResponseAsset类的setDuration方法缺少返回类型:需补充为public void setDuration(Optional<Long> duration)
内容的提问来源于stack exchange,提问作者thurmc
相关产品推荐
相关产品推荐

