![](/img/trans.png)
[英]Java: returning a class that implements an interface which has type-inference
[英]Java interface function returning class that implements it
我有一个接口,该函数当前返回自身。 但是,我希望所有实现类都返回该类而不是基本接口。 例如,在这个简化的示例中,这可以正常工作:
public interface MyInterface<T, U> {
public void foo(T t, U u);
public MyInterface baz();
}
public class MyClass<T, U> implements MyInterface<T, U> {
@Override
public void foo(T t, U u) {}
public MyClass bar() {
return this;
}
@Override
public MyInterface baz() {
return this;
}
}
但是,如果我将最后一个功能更改为此:
@Override
public MyClass baz() {
return this;
}
显然,这失败了,因为覆盖函数不再与接口中的声明匹配。
我需要baz()返回Class而不是Interface的原因是因为调用者可以按任意顺序多次调用bar和baz,但是当前所有bar()调用必须在所有baz()调用之前,除非我们反复贬低它。
更复杂的是使用两种泛型类型的foo()函数。 我研究了使用奇怪的重复通用模式,但无法找到合理的解决方案,因为Interface已经处理了通用模式,即使没有通用模式也是如此。
有什么办法可以解决这个问题? 谢谢!
如果要让接口返回已定义的类型,则需要另一个类型参数(例如,名为W
),并希望确保该类型是Interface
,所以:
public interface MyInterface<T, U, W extends MyInterface<T, U, W>> {
public void foo(T t, U u);
public W baz();
}
public class MyClass<T, U> implements MyInterface<T, U, MyClass<T, U>> {
@Override
public void foo(T t, U u) {}
public MyClass<T, U> bar() {
return this;
}
@Override
public MyClass<T, U> baz() {
return this;
}
}
注意:添加了前缀My
以避免与名为Class
内置类混淆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.