Android Studio:模棱两可的方法调用

时间:2019-03-11 19:29:37

标签: android android-espresso

我正在创建一个自定义Matcher,用于在第三方ToggleSwitch上运行Espresso测试。我想让Espresso知道在这些开关中“选择了”哪个切换开关。

Android Studio在自定义匹配器类的红色部分下划线。问题是,项目成功构建,测试成功运行。

我不知道

  1. 为什么出现模棱两可的方法调用错误

  2. 如果存在语法错误,为什么构建成功。

这是代码

import android.view.View;
import com.llollox.androidtoggleswitch.widgets.ToggleSwitch;
import org.hamcrest.Description;
import androidx.test.espresso.matcher.BoundedMatcher;

public class ToggleSwitchMatcher extends BoundedMatcher<View, ToggleSwitch> {

    private final int togglePos;

    static ToggleSwitchMatcher inPosition(int togglePos){
        return new ToggleSwitchMatcher(togglePos);
    }

    private ToggleSwitchMatcher(final int togglePos){
        super(ToggleSwitch.class);
        this.togglePos = togglePos;
    }

    @Override
    protected boolean matchesSafely(ToggleSwitch item) {
        return item.getCheckedPosition() == togglePos;
    }

    @Override
    public void describeMismatch(Object item, Description description) {
        super.describeMismatch(item, description);
    }

    @Override
    public String toString() {
        return super.toString();
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("with checked position:").appendValue(togglePos);
    }
}

此行中的括号带有下划线

    return item.getCheckedPosition() == togglePos;

错误状态:

  

歧义方法调用。 ToggleSwitch中的getCheckedPosition()和ToggleSwitch中的getCheckedPosition()都匹配

2 个答案:

答案 0 :(得分:1)

错误在于ToggleSwitch类中。该类声明属性var checkedPosition : Int? = null,Kotlin将为此属性生成一个名为getCheckedPositionsetCheckedPosition的getter和setter。但是,该类还使用这些名称声明函数。

让我们检查一下Kotlin字节码,看看为什么编译。该属性编译为:

public final getCheckedPosition()Ljava/lang/Integer;
@Lorg/jetbrains/annotations/Nullable;() // invisible
 L0
 LINENUMBER 12 L0
 ALOAD 0
 GETFIELD com/llollox/androidtoggleswitch/widgets/ToggleSwitch.checkedPosition : Ljava/lang/Integer;
 ARETURN
L1
 LOCALVARIABLE this Lcom/llollox/androidtoggleswitch/widgets/ToggleSwitch; L0 L1 0
 MAXSTACK = 1
 MAXLOCALS = 1

吸气剂编译为:

public final getCheckedPosition()I
 L0
 LINENUMBER 43 L0
 ALOAD 0
 GETFIELD com/llollox/androidtoggleswitch/widgets/ToggleSwitch.checkedPosition : Ljava/lang/Integer;
 DUP
 IFNULL L1
 INVOKEVIRTUAL java/lang/Integer.intValue ()I
 GOTO L2
L1
 POP
 ICONST_M1
L2
 IRETURN
L3
 LOCALVARIABLE this Lcom/llollox/androidtoggleswitch/widgets/ToggleSwitch; L0 L3 0
 MAXSTACK = 2
 MAXLOCALS = 1

由于返回类型的不同,方法签名也不同,因此JVM接受两种方法,但对于调用方来说是模棱两可的。

该类应该将getter和setter功能移到属性的get()set()声明中。

答案 1 :(得分:0)

从类ToggleSwitch.kt中删除歧义的吸气剂应使其按预期工作:

fun getCheckedPosition() : Int {
    return checkedPosition ?: -1
}