无法将实现传递给声明泛型接口(Java)的方法
两次尝试在下面的MyTest类中传入我的泛型类。策略层次结构似乎很好,但将泛型接口作为参数声明方法会有问题。我如何解决这个问题无法将实现传递给声明泛型接口(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> {
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是固定的,任何策略实现仍然可以与任一解决方案一起使用。然而,我的例子似乎不完整,所以我明天将添加进一步的上下文。这是问题的本质,所以答案是可以接受的