如何在Lambda参数中使用类而不是接口

时间:2019-01-31 04:34:05

标签: java java-10

现在我有这个:

  public static interface AsyncCallback<T, E> {
    public void done(E e, T v);
  }

我想将其转换为此,因此我在其上使用了布尔属性:

  public abstract static class AsyncCallback<T, E> {
    boolean shortcircuit = false;
    public abstract void done(E e, T v);
  }

但是现在我遇到了错误:

  

不可转换的类型;无法将“”强制转换为“ E”

  

不存在类型变量T的实例,因此List符合   AsyncTask

我生成错误的代码基于传递的lambda。有谁知道为什么将接口转换为类会导致问题?即使我注释掉shortcircuit字段并且仅完成方法定义,也会出现相同的错误。

2 个答案:

答案 0 :(得分:3)

您不能使用类代替接口(确切地说是功能接口)。

请参阅link,了解为什么我们需要功能接口才能在Java中使用lambda。

  

在您的情况下,您尝试使用一个类,该类显然具有   名字,不是。但是要使用lambda,我们必须使用匿名函数   没有名称和类型。

答案 1 :(得分:0)

我通过保留接口但也使用类来解决此问题:

  public static interface AsyncTask<T, E> {
    public void run(AsyncCallback<T, E> cb);
  }

  public static interface IAsyncCallback<T, E> {
    public void done(E e, T v);
  }

  public static abstract class AsyncCallback<T, E> implements IAsyncCallback<T, E> {
    public boolean shortcircuit = false;
  }

在必须使用接口的情况下,请使用IAsyncCallback接口,在可以使用类的地方,请使用AsyncCallback类。