繁体   English   中英

Java接口函数返回实现它的类

[英]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.

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