当前位置: 首页 > 知识库问答 >
问题:

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

习华灿
2023-03-14

两次尝试在下面的MyTest类中传递我的泛型类。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编译错误:类型策略中的方法setNode(capture#1-of?extends Node)不适用于参数(NodeImpl)

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

MyTest类是继承层次结构的一部分,我希望保持test1()或test2()方法通用,能够在任何策略实现中传递

共有2个答案

嵇丰
2023-03-14

这似乎解决了问题,但有点笨重。我还对本示例代码范围内的任何设计注释感兴趣。

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());
    }
}
董凡
2023-03-14

如果使用NodeImpl而不是Node(泛型是强类型的),则可以编译test1和test2。关于Test1,根据Marko的建议,您应该使用策略

 类似资料:
  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 问题内容: 上周受本文启发,我正在重构我必须更明确地将上下文(数据库池,会话存储等)传递给处理程序的应用程序。 但是,我遇到的一个问题是,如果没有全局模板映射,我的自定义处理程序类型(要满足)上的方法将无法再访问该映射以呈现模板。 我需要保留全局变量,或者将我的自定义处理程序类型重新定义为结构。 有没有更好的方法来实现这一目标? func.go struct.go 有没有更干净的方法将实例传递给?

  • 我正在使用typescript,无法使用其他文件中声明的接口 我的看起来像这样。 下面是tsconfig.json 目录结构如下所示 在< code>common.ts文件中使用它

  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):

  • 这个问题是关于接口与实现该接口的类之间的关系。我看不出这个或这个如何回答这个问题。 我创建了一个接口和一个抽象泛型类,它实现了该接口。然后创建两个具体的类和。然后创建了一个元素列表,这些元素使用一个值和一个值扩展了。到目前为止还不错。 现在我要分配扩展为。我的期望是,这应该是有效的,因为无论什么扩展也实现。但编译器不允许我。这是一个错误: 我可以复印一下名单: 用于创建一个值,如果类型为。但赋值报

  • 问题内容: 我有一个带有包含泛型的参数的方法。 我想一个传递的s到这种方法。 是实现的接口。如何更改方法声明以允许这样做? 问题答案: 如果您使用的是Java 1.5版或更高版本,则可以使用通配符。 此解决方案较为通用,因为它适合的所有接口实现以及的子类/子接口。有关更多详细信息,请转到通配符教程。