Android上使用Java三元运算符的奇怪行为

Android上使用Java三元运算符的奇怪行为,java,android,Java,Android,我不知道为什么,但当我在这个例子中使用三元运算符时,我得到了一个奇怪的错误: 我认为这与Java从操作符转换结果的方式有关,但它只发生在某些特定情况下 谢谢你的解释 注意:我搜索了一个,但只能找到与NPE相关的答案 -编辑- 该应用程序使用: 编译DK23版 buildToolsVersion'23.0.2' 明斯克版本14 targetSdkVersion 23 Android支持库23.2.0 在Android Studio 2.0 Beta 5和相应的gradle版本上进行的测试原因

我不知道为什么,但当我在这个例子中使用三元运算符时,我得到了一个奇怪的错误:

我认为这与Java从操作符转换结果的方式有关,但它只发生在某些特定情况下

谢谢你的解释

注意:我搜索了一个,但只能找到与NPE相关的答案

-编辑-

该应用程序使用:

  • 编译DK23版
  • buildToolsVersion'23.0.2'
  • 明斯克版本14
  • targetSdkVersion 23
  • Android支持库23.2.0

在Android Studio 2.0 Beta 5和相应的gradle版本上进行的测试

原因在于三元运算符的工作方式

它总是将两个对象都强制转换为两个对象共同的最近的超级类型。 在您的情况下,它是
BaseInterpolator
,因为您的targetSDK版本设置为
23

但是,由于您的minSDK是
14
,因此cast不能在所有设备上工作。因此出现了错误


若要修复,您可以向这两个对象添加一个显式的
TimeInterpolator

我通过以下代码修复此问题:

public class MyDecelerateInterpolator implements Interpolator {

    private DecelerateInterpolator interpolator = null;

    public MyDecelerateInterpolator() {
        interpolator = new DecelerateInterpolator();
    }

    public MyDecelerateInterpolator(float factor) {
        interpolator = new DecelerateInterpolator(factor);
    }

    @Override
    public float getInterpolation(float input) {
        return interpolator.getInterpolation(input);
    }
}

您为应用程序设置了哪种api级别?因为
LinearInterpolator
扩展了
BaseInterpolator
,它将minSdkVersion更改为22…它防御地希望您将minapi version设置为22。因为使用了public void setInterpolator(TimeInterpolator值),但您设置了扩展基的linearinterpolatorinterpolator@KonstantinVolkovBaseInterpolator扩展了实现时间内插器的内插器。这应该是工作。是的,我知道,但只有从22 api这是奇怪的可能是它会好的,如果你设置你将改变构建版本为21?添加一些解释与答案,这个答案如何帮助解决目前的问题操作我读代码的DeccelerateInterpolator。它实现BaseInterpolator,witch实现Interpolator。BaseInterpolator没有添加任何抽象方法。这意味着这两个类具有相同的抽象方法getInterpolation(浮点输入)。我不知道为什么会显示错误,但只要抽象方法相同,我们就可以定义一个实现插值器和减速器插值器的类。这样就没有更多的错误显示了。对我来说不起作用:这次林特抱怨把BaseInterpolator转换成TimeInterpolator。但当我用简单的“if”替换三元运算符时,错误已经消失了。这不是很奇怪吗?