【问题标题】:Android call non-static Java method from KotlinAndroid 从 Kotlin 调用非静态 Java 方法
【发布时间】:2020-02-26 22:54:43
【问题描述】:

我正在尝试从 Kotlin 文件调用非静态 Java 方法,因为我需要能够使用 findViewById。但是,当我将方法更改为非静态时,Kotlin 文件返回以下错误:未解析的引用:main。当 Java 方法是静态的时,Kotlin 文件能够运行 Java 方法。

Kotlin 文件:

class RoundFactoryImpl(private val randomiser: Randomiser) : RoundFactory {
     override fun buildRound(cards: List<Card>): Round = Round()
     val card = Round()
     val customer = PokemonRand.main(randomiser, card)
}

Java 文件:

public void main(Randomiser randomiser, Round cards) {
    Card cardA, cardB;

    cardA = getCard(randomiser, cards);
    cardB = getCard(randomiser, cards);

    Log.d("cardA", cardA.toString());
    Log.d("cardB", cardB.toString());

    while (cardA.getRarity() == cardB.getRarity()) {
        cardB = getCard(randomiser, cards);
    }

    dispCard(cardA, cardB);
    compCard(cardA, cardB);
}

【问题讨论】:

  • 你需要一个 PokemonRand 类的实例才能调用它的实例方法。但我认为这里还有一些更基本的设计问题。这个名为main 的函数(它确实应该有一个名称来描述它的作用)不返回任何内容。它基本上是一个需要一副纸牌的功能,我想向用户显示其中的两张。那么为什么一个叫做工厂的东西告诉其他对象在工厂实例化时选择并显示两张卡片,然后将Unit 存储在一个名为customer 的属性中?这些都没有任何意义。

标签: java android kotlin


【解决方案1】:
val customer = PokemonRand.main(randomiser, card)

您的代码的第一个问题是您将main 方法的值分配给返回类型为voidcustomer 变量;

代码的第二个问题是您的主要方法不是静态的,因此您需要创建PokemonRand 类的实例并在该实例上调用main 方法,如下所示

val pokemon = PokemonRand();
pokemon.main(randomiser, card);

【讨论】:

  • 我把它改成了你写的,但我在 pokemon.main(randomiser, card);这就是说期待成员声明
  • 如果 PokemonRand 是视图控制器(Activity 或 Fragment),实例化一个调用该方法是没有意义的。
  • @Imstuck 你能把PokemonRand class 的完整代码贴出来
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2013-08-22
  • 1970-01-01
  • 2012-12-24
  • 2014-07-28
  • 1970-01-01
  • 2014-08-25
  • 2011-11-14
相关资源
最近更新 更多