为实现接口的类强制实施返回类型

2022-09-03 05:23:56

如何强制实现类中的方法 getFoo() 返回同一实现类类型的列表。

public interface Bar{
     ....
     List<? extends Bar> getFoo(); 
}

现在,实现 Bar 的类返回实现 Bar 的任何类的对象。我想让它更严格,以便实现Bar的类在getFoo()中返回仅其类型的对象列表。


答案 1

不幸的是,Java的类型系统无法强制执行这一点。

但是,您可以通过使用以下命令来非常接近:

public interface Bar<T extends Bar<T>> {
    List<T> getFoo();
}

然后你的实现类可以像这样实现它:

public class SomeSpecificBar implements Bar<SomeSpecificBar> {
    // Compiler will enforce the type here
    @Override
    public List<SomeSpecificBar> getFoo() {
        // ...
    }
}

但没有什么能阻止另一个类这样做:

public class EvilBar implements Bar<SomeSpecificBar> {
    // The compiler's perfectly OK with this
    @Override
    public List<SomeSpecificBar> getFoo() {
        // ...
    }
}

答案 2

这在Java中是不可能的,但您可能想知道在界面中强制执行此操作的用例是什么。

  • 如果你针对接口编程(你通常这样做,否则为什么要定义接口),那么类型将是未知的
  • 如果针对特定类进行编程,则此线程已提供了有关如何实现该特定类以返回 .由于您针对该特定类进行编程,因此编译器可以访问该特定返回类型并了解它List<itself>

推荐