Classifier没有伴随对象,因此必须在这里初始化

问题描述 投票:0回答:4

我有一个 Activity,其中声明了一个接口,我有一个

ViewModel
类,它具有重写的接口,并希望从
Activity
调用接口的方法以在
ViewModel
类中进行更改,但无法调用
Activity 中的方法
ViewModel 类没有伴随对象,因此必须在这里初始化。如何解决这个问题?

var selection: setSelectionSubRow? = null
    selection=RowSubTShirtViewModel
    selection!!.setNameSelection(false)

以上代码在

Activity
中,其名称为
TShirtActivity
.

以下代码来自

RowViewModel
class

class RowSubTShirtViewModel(private val subTShirtAdapter: SubTShirtAdapter, val context: TShirtActivity,
                        val tShirtBean: CommonItemBean, private val parentPosition: Int, private val position: Int) : BaseObservable() ,TShirtActivity.setSelectionSubRow{

fun getImageDrawable(): Drawable {
    return if (tShirtBean.isSelected)
        ContextCompat.getDrawable(context, R.drawable.green_border_circle)!!
    else
        ContextCompat.getDrawable(context, R.drawable.border_circle)!!
}

override fun setNameSelection(selection: Boolean) {
    if (parentPosition == 6) {
        if (position == 1) {
            tShirtBean.isSelected = false
        }
    }
}
android kotlin interface
4个回答
9
投票

这一行

selection=RowSubTShirtViewModel
引用视图模型,就好像它是一个命名对象,这意味着你会写而不是类对象:

object RowSubTShirtViewModel {
   //...
}

但是,由于情况并非如此,kotlin 告诉您不能那样引用它并且必须对其进行初始化。构造函数有很多参数让我猜测它们是什么,但基本上你必须将它们传递进来:

selection=RowSubTShirtViewModel(/*parameters here*/)

1
投票

在 Kotlin 中拥有伴生对象(并在伴生对象中拥有成员in)等同于在 Java 中拥有静态成员(静态方法或字段),众所周知,Java 中的静态成员无需初始化类即可访问或引用该类的对象。例如,给定:

// this is Java
class A {
  static void s() {System.out.println("static");}
  void d() {System.out.println("dynamic");}
}

我们可以在不初始化类

s()
的情况下调用
A
方法,像这样:
A.s();
,它会打印“static”,但是为了能够调用
d()
方法,我们需要一个 A
类的对象
,我们可以通过像这样在其他地方初始化它来获得它:
A a = A();
,然后做
a.d();
或者像这样一起做它们:
A().d();
,两者都会打印“动态” .

即使 Kotlin 没有

static
关键字,它也必须具有相同的功能,因为任何 Java 代码都可以翻译成 Kotlin 代码。现在,当我们想将这种思路转移到 Kotlin 中时,我们会说“为了使用伴随对象中的成员(基本上是静态成员),您必须初始化类名(即创建一个对象)”。

所以当 Kotlin 抱怨说 Classifier

Something
没有伴随对象,因此必须在这里初始化,它基本上是在告诉你那个类没有任何静态成员(因为它没有伴随对象), 所以如果你想使用它,要么用括号使用它(初始化它以创建它的对象),要么在其中声明一个伴随对象(使用
companion object
关键字)。

我希望这能解决问题。可悲的是,像这样没有信息的消息证明你需要事先了解 Java 才能学习 Kotlin,这个事实困扰着它并将阻碍它作为一种语言独立存在的能力。


0
投票

在我的例子中,我在

ApplicationModule
中为
dagger2
得到了这个错误。

@Provides
@Singleton

 internal fun providesxx(xx: xxx): xx {
        return xx
    }

我只是重命名参数!


0
投票

对于那些没有找到正确答案的人,问题是因为内联函数语法错误。

正确的语法是:

val selection: RowSubTShirtViewModel by viewModels()

将类赋值给变量需要类是一个对象。

© www.soinside.com 2019 - 2024. All rights reserved.