无法将实现传递给声明通用接口的方法 (Java)

Can't pass implementation to method declaring generic interface (Java)

两次尝试在下面的 MyTest class 中传递我的通用 class。 Strategy 层次结构看起来不错,但是使用通用接口作为参数声明方法存在问题。我该如何解决?

interface Node {}

class NodeImpl implements Node {}

interface Strategy <N extends Node> {

    void setNode(N node);

}

class MyStrategy implements Strategy<NodeImpl> {

    @Override
    public void setNode(NodeImpl node) {
    }

}

class MyTest {

    void test1(Strategy<? extends Node> s) {
        s.setNode(new NodeImpl()); // compile error
    }

    void test2(Strategy<Node> s) {
        s.setNode(new NodeImpl());
    }

    void v() {
        test1(new MyStrategy());
        test2(new MyStrategy()); // compile error
    }
}

Test1编译错误: 类型 Strategy 中的方法 setNode(capture#1-of ? extends Node) 不适用于参数 (NodeImpl)

测试2编译错误: MyTest 类型中的方法 test2(Strategy) 不适用于参数 (MyStrategy)

MyTest class 是继承层次结构的一部分,我希望保持 test1() 或 test2() 方法通用,能够传入任何 Strategy 实现

如果使用 NodeImpl 而不是 Node(泛型是强类型),test1 和 test2 可以编译。 关于 Test1,根据 Marko 的建议,您应该在方法签名中使用 Strategy <? super NodeImpl>

这似乎解决了问题,但有点笨拙。 我也对此示例代码范围内的任何设计评论感兴趣。

interface Node {}

class NodeImpl implements Node {}

interface Strategy <N extends Node> {

    void setNode(N node);

    Class<N> getType();
}


class MyStrategy implements Strategy<NodeImpl> {

    @Override
    public void setNode(NodeImpl node) {
    }

    @Override
    public Class<NodeImpl> getType() {
        return NodeImpl.class;
    }
}

class MyTest {

    <T extends Node> void test3(Strategy<T> s) {    
        s.setNode(s.getType().cast(new NodeImpl()));
    }

    void v() {
        test3(new MyStrategy());
    }
}