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) { ... }
}