Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java在匿名类中实现通用接口_Java_Generics - Fatal编程技术网

java在匿名类中实现通用接口

java在匿名类中实现通用接口,java,generics,Java,Generics,给定以下接口 public interface Callback<T> { <K, V> T execute(Operation<K, V> operation) throws SomeException; } 因为类名中的类型参数和方法中的类型参数实际上是不同的,所以您可以执行以下操作 @Override public <K, V> Boolean execute(Operation<K, V> opera

给定以下接口

 public interface Callback<T> {
    <K, V> T execute(Operation<K, V> operation) throws SomeException;
 }

因为类名中的类型参数和方法中的类型参数实际上是不同的,所以您可以执行以下操作

   @Override
    public <K, V> Boolean execute(Operation<K, V> operation)
            throws SomeException {
        return false;
    }
@覆盖
公共布尔执行(操作)
抛出一些异常{
返回false;
}

方法上的泛型与类泛型参数无关

您需要在方法上重复这些步骤才能使其正确,例如

Callback<Boolean> callback = new Callback<Boolean>() {
        @Override
        public <X,Y> Boolean execute(Operation<X, Y> operation) {

        }
};
executor.execute(callback);
不能由一个

    Boolean execute(Operation<String, String> operation) throws SomeException;
因为第二个方法具有不同的签名。但是您的
操作
类将被擦除为原始类型,而不管它是
操作
还是
操作

有一件事你可以做。。。但它变得一团糟

public interface StringOperation extends Operation<String,String> {}
公共接口StringOperation扩展了操作{}
那你就可以了

Callback<Boolean> cb = new Callback<Boolean> {
  @Override
  public <K,V> Boolean execute(Operation<K,V> o) { ... }
  // not an @Override
  public Boolean execute(StringOperation o) { ... }
}
Callback cb=新回调{
@凌驾
公共布尔执行(操作o){…}
//不是@Override
公共布尔执行(StringOperation o){…}
}

但是请记住,
execute(Callback)
方法将调用
Boolean execute(Operation o)
,而不是
Boolean execute(StringOperation o)

您会得到什么编译错误?我可以看到您的函数没有返回语句,这是一个编译错误。编译错误的原因是什么?
SomeException
在哪里?我建议您不要重复使用任何公共类或接口的名称,而是使用其他名称。重复使用名称会导致像您一样的混乱。一个好的IDE应该生成正确的实现方法。*编辑以添加返回语句。编译错误是CallbackCaller不是抽象的,并且不重写抽象方法execute(操作操作)。这是可行的,但如果我明确希望操作在side execute方法中使用泛型类型,该怎么办?您必须将
回调
更改为
回调
,谢谢。不幸的是,在这种情况下,这不是一个接口I控件。@user1735096那么您应该这样做。
 public interface Callback<T> {
    T execute(Operation<Object, Object> operation) throws SomeException;
 }
 public interface Callback {
    Boolean execute(Operation<Object, Object> operation) throws SomeException;
 }
    Boolean execute(Operation<String, String> operation) throws SomeException;
public interface Callback<T> {
  T execute(Object key, Object value);
}

Callback<Boolean> cb = new Callback<Boolean> {
  @Override
  public Boolean execute(Object k, Object v) { ... }
  // not an @Override
  public Boolean execute(String k, String v) { ... }
}
public interface StringOperation extends Operation<String,String> {}
Callback<Boolean> cb = new Callback<Boolean> {
  @Override
  public <K,V> Boolean execute(Operation<K,V> o) { ... }
  // not an @Override
  public Boolean execute(StringOperation o) { ... }
}