无法将实现传递给声明通用接口的方法 (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());
}
}
两次尝试在下面的 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());
}
}