返回 Optional 对象的通用类型转换方法

Generic type-casting method returning an Optional object

我有一个方法:

public LoadService {
    public <T> T load(String blobId, Class<T> objectClass) {
        // do stuff here
    }
}

这让我可以像这样调用它:

Fizz fizz = loadService.load("12345", Fizz.class);
Buzz buzz = loadService.load("23456", Buzz.class);

这太棒了。 除了 ,现在,我希望 load(...) 到 return 和 Optional<???> 这样交互看起来像:

Optional<Fizz> maybeFizz = loadService.load("12345", Fizz.class);
if (maybeFizz.isPresent()) {
   // etc.
}

Optional<Buzz> maybeBuzz = loadService.load("23456", Buzz.class);
if (maybeBuzz.isPresent()) {
   // etc.
}

我需要对 load(...) 方法进行哪些更改才能使其能够 returning 一个 <T>Optional

你可以通过声明这样的东西来做到这一点。

public static <T> Optional<T> load(Object something, Class<T> clazz){
  return Optional.of((T)something);
}

您可以 type-cast load() 方法中的给定对象,就像这样:

T result = (T) myObject;

或者利用 Class<T> class:

cast() 方法
T result = objectClass.cast(myObject);

唯一不同的是,在第一种情况下,编译器会对未经检查的情况发出警告type-cast。

为了从可为 null 的值创建一个可选对象,您必须使用静态方法 Optional.ofNullable(),如果给定值为 null,它将创建一个空的可选对象。相反,方法 Optional.of() 如果您将 null 引用传递给它,则抛出 NullPointerException

所以你方法的return子句可以这样写:

return Optional.ofNullable(objectClass.cast(myObject));

return Optional.ofNullable((T) myObject);