【问题标题】:How can I pass parameters from the outside to an implementation of an inteface如何将参数从外部传递给接口的实现
【发布时间】:2015-01-09 19:41:43
【问题描述】:

我创建了一个通用数据结构并为其实现了一个自定义迭代器, 那个迭代器接收一个具有函数的接口,数据结构中的每个对象都是从对象上的接口发送给函数的。

这是我的做法:

界面:

public interface QTreeAction<T> {
    void actToDo(T Param);
}

迭代器:

public void Iterate(QNode qNode, QTreeAction<T> action)
{
    if (qNode == null)
        return;

    for (int j = 0; j < qNode.objList.size(); j++)
    {
        action.actToDo(qNode.objList.get(j).Object);
    }

    for (int i = 0; i < 4; i++)
    {
        this.Iterate(qNode.Nodes.get(i), action);
    }
}

还有电话:

public void Render(float fDelta, Canvas g) {
    g.drawRGB(255, 255, 10);
    g.setMatrix(this.gameMatrix);

    ohHandler.render(new QTreeAction<Tile>() {
        @Override
        public void actToDo(Tile Param) {
            Param.render(fDelta, g);
        }
    });
    this.pPlayer.render(fDelta, g);
}

(ohHandler有节点,调用迭代器)

渲染函数:

public void render(float fDelta, Canvas g) {
    g.drawBitmap(StaticDataHolder.GameTextures.blocks[ttType.getValue()],
            this.vecTilePosition.getX(), this.vecTilePosition.getY(), null);
}

如您所见,Param.render 需要函数提供的 2 个参数,但是在这种情况下出现错误,它要求我将参数设置为最终参数,但它在运行时抛出错误。

我该如何克服这个问题?

【问题讨论】:

  • 你是说参数final会出错吗?什么错误?

标签: java android generics parameters interface


【解决方案1】:

在这种情况下,您只能在匿名类中引用最终变量。

这应该可以解决问题:

public void Render(float fDelta, Canvas g) {
    final Cavas gFinal = g;
    final float fDeltaFinal = fDelta;
    ohHandler.render(new QTreeAction<Tile>() {
        @Override
        public void actToDo(Tile Param) {
            Param.render(fDeltaFinal , gFinal);
        }
    });
    this.pPlayer.render(fDelta, g);
}

【讨论】:

  • 我稍微修改了代码,如果我需要更改函数内部的画布怎么办?
  • @HuMMeR-SI 您将能够毫无问题地更改Canvas g 的状态,但您将无法使用g = new Canvas();(或类似的东西),仅此而已。
  • 您可以随意更改。但是你从一个方法传递给匿名类的变量必须是最终的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2011-01-19
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2012-08-29
相关资源
最近更新 更多