java - 如何用不同的方式实现同​​一个接口(interface)的泛型方法?

标签 java generics overriding

我定义了Face接口(interface)如下:

public interface Face {
    <R> LoadBalancer<R> create(List<R> resources);    
}

然后是另一个接口(interface) Type 和两个实现 Face 接口(interface)的类。

public interface Type{}

这是名为 FaceImpl1Face 接口(interface)的第一个实现。

public class FaceImpl implements Face {

    @Override
    public <R extends Type> create<R> newLoadBalancer(List<R> resources) {
        return new SomeObject<R>(resources).
    }
}

另一个实现FaceImpl2

public class FaceImpl2 implements Face {

    @Override
    public <R> create<R> create(List<R> resources) {
        return new SomeObject2<R>(resources).
    }
}

如您所见,我想将泛型类型 R 限制为在 FaceImpl1 中实现 Type 接口(interface)的类,但在类FaceImpl2,我不需要这个限制。

问题是 Java 不允许这样做。那么为了做到这一点,我应该如何实现这两个不同的类?或者有更好的方法来做到这一点?

最佳答案

您可以通过设置interface来做到这一点本身是有界类型的泛型

interface Face<R> {

    List<? extends R> create(List<? extends R> resources);
}

public interface Type {
}

public class Impl implements Face<Type> {

    @Override
    public List<? extends Type> create(List<? extends Type> resources) {            
    }
}

public class Impl2 implements Face<Object> {

    @Override
    public List<? extends Object> create(List<? extends Object> resources) {
    }
}

否则该方法不会实现 interface 中定义的合约正如契约(Contract)所说“任何类型 R ”,并且您使您的方法更具约束力。

想想当有人这样做时会发生什么:

final FaceImpl1 face1 = new  FaceImpl1();
final Face face = (Face) face1;

这是完全有效的,但在您的尝试下,您现在失去了任何类型限制。

如果将类型添加到 interface您将收到编译器警告,因为您将转换 Face<Something>Face - 即原始类型。

关于java - 如何用不同的方式实现同​​一个接口(interface)的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15947187/

相关文章:

ruby - 关于 ruby​​ 中重写 + 运算符的问题

C# 在继承链下覆盖多个派生类的基类方法

jQuery Mobile CSS 干扰了我的 CSS

java.security.AccessControlException : Access denied (java. io.FilePermission

java - 提高模糊字符串匹配字典的性能

java - [Android][RecyclerView] 方法不会覆盖或实现父类(super class)型的方法

java - 当具有有界类型参数的类的方法返回其自身类型的值时,如何让返回值保持通用(不进行转换)?

java - 为什么 XMLEventReader 报告包含标记的 CHARACTERS 事件?

swift - 为什么 swift 不使用没有类型约束的通用返回参数来推断适当的重载函数?

c# - 有什么办法可以将这些几乎相同的类合并为一个吗?