繁体   English   中英

Java Futures和Callable中具有类型检查的泛型方法实现

[英]Generic method implementation with type checking in Java Futures and Callable

我正在尝试使用HazelCast添加自定义缓存层,但是我不确定如何实现以下方法

public <T> CompletionStage<T> getOrElseUpdate(String key, Callable<CompletionStage<T>> callable, int expiration)

以下是我的全班课。 上述方法的约定是从缓存中基于键查找项目,或者执行该块并返回其中添加了项目的完成阶段。

我尝试了几种方法,但是很多类型擦除错误和Callable<CompletionStage<T>>未转换使我感到困惑。

import akka.Done;
import com.hazelcast.core.IMap;
import play.cache.AsyncCacheApi;

import java.util.concurrent.*;

import static java.util.concurrent.CompletableFuture.runAsync;
import static java.util.concurrent.CompletableFuture.supplyAsync;

public class MyAsyncCache<T> implements AsyncCacheApi {

    IMap<String, T> internalMapCache;

    @Override
    public <T> CompletionStage<T> get(String key) {
        return supplyAsync( () -> {
            T t = (T) internalMapCache.get(key);
            return t;});

    }

    @Override
    public <T> CompletionStage<T> getOrElseUpdate(String key, Callable<CompletionStage<T>> callable, int expiration) {

        supplyAsync( () -> {
            T t = (T) internalMapCache.get(key);
            if(t == null){
                //callable.call()
            }else {
                return t;
            }
        }

        );
    }

    @Override
    public <T> CompletionStage<T> getOrElseUpdate(String key, Callable<CompletionStage<T>> block) {

    }

    @Override
    public CompletionStage<Done> set(String key, Object value, int expiration) {
        return set(key,value);
    }

    @Override
    public CompletionStage<Done> set(String key, Object value) {
        return supplyAsync( () -> {
            internalMapCache.set(key, value);
            return Done.getInstance();
        });
    }

    @Override
    public CompletionStage<Done> remove(String key) {
        return supplyAsync( () -> {
           internalMapCache.remove(key);
            return Done.getInstance();
        });
    }

    @Override
    public CompletionStage<Done> removeAll() {
        return supplyAsync( () -> {
            internalMapCache.clear();
            return Done.getInstance();
        });
    }

}

任何帮助,导致解决此问题将不胜感激。


更新

  1. 从类MyAsyncCache<T>中删除该类型不需要在该级别上是通用的,因此现在它只有MyAsyncCache
  2. 我如下添加了方法getOrElseUpdate实现,但是我觉得它可以改进。

方法更新如下:

@Override
public <T> CompletionStage<T> getOrElseUpdate(String key, Callable<CompletionStage<T>> callable, int expiration) {
    CompletableFuture<T> uCompletableFuture = supplyAsync(() -> {
        T obj;
        if (!mapBased.containsKey(key)) {
            try {
                Future<CompletionStage<T>> submit = Executors.newSingleThreadExecutor()
                                                             .submit(callable);
                obj = submit.get().toCompletableFuture().get();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        } else {
           obj = (T) mapBased.get(key);
        }
        return obj;
    });
    return uCompletableFuture;
}

如何改善上述方法?

in

public class MyAsyncCache<T> implements AsyncCacheApi {

和T in

public <T> CompletionStage<T> get(String key) {

是不同的。 为它们使用不同的字母。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM