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

无法将实现传递给声明泛型接口(Java)的方法,java,generics,Java,Generics,两次尝试在下面的MyTest类中传入我的泛型类。策略层次结构似乎很好,但将泛型接口作为参数声明方法会有问题。我如何解决这个问题 interface Node {} class NodeImpl implements Node {} interface Strategy <N extends Node> { void setNode(N node); } class MyStrategy implements Strategy<NodeImpl> {

两次尝试在下面的MyTest类中传入我的泛型类。策略层次结构似乎很好,但将泛型接口作为参数声明方法会有问题。我如何解决这个问题

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编译错误: 的方法setNodecapture1?类型策略中的扩展节点不适用于参数NodeImpl

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


MyTest类是继承层次结构的一部分,我希望保持test1或test2方法的通用性,能够传入任何策略实现,如果使用NodeImpl而不是强类型的节点泛型,test1和test2可以编译。
关于Test1,根据Marko的建议,您应该使用策略这似乎可以解决问题,但它有点笨重。 我还对本示例代码范围内的任何设计注释感兴趣

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());
    }
}

Test1失败,因为您违反了PECS规则。你在一个消费类型上使用了一个上限。Marko-我想你是说DoTest1Strategys你有s.set new NodeImpl,这显然要求签名是策略。我可以看到,正如最初的示例所示,这是一个与Marko建议的相同的过于复杂的解决方案。我可以看出NodeImpl是固定的,任何策略实现仍然可以与任一解决方案一起使用。然而,我的例子似乎不完整,所以我明天将添加进一步的上下文。这是问题的本质,所以答案是可以接受的