2016-02-25 31 views
8

我不知道爲什麼,但是當我使用三元操作符在這個例子中,我得到這個奇怪的錯誤:奇怪的行爲使用Java三元操作在Android

Screenshot of the strange behavior of setInterpolator

我認爲它的方式有關Java從操作員那裏得到結果,但它只發生在一些特定情況下。

感謝您的任何解釋。

注:我搜索了一個,但只能找到與NPE相關的答案。

CNC中

應用程序使用:

  • compileSdkVersion 23
  • buildToolsVersion '23 .0.2'
  • 的minSdkVersion 14
  • targetSdkVersion 23
  • Android的支持庫23.2。 0

在Android Studio 2.0 Beta 5上執行相應的gradle版本的測試

+2

你爲你的應用程序設置哪些API級別?因爲'LinearInterpolator'擴展了'BaseInterpolator' [需要api level 22] –

+0

將minSdkVersion更改爲22 ... – brso05

+0

它通常需要您將min api版本設置爲22. becouse public void setInterpolator(TimeInterpolator value),但您設置了擴展基本插補器的線性插補器 –

回答

11

原因是因爲三元運算符的工作方式。

它始終將兩個對象都投射到它的最近最近這兩個對象的公共超級類型。 就你的情況而言,這是BaseInterpolator,因爲你的targetSDK版本設置爲23

但是,由於您的MINSDK是14,所以在所有設備上投射將不起作用。因此錯誤。

要解決此問題,您可以向兩個對象添加明確的TimeInterpolator

0

我的代碼如下解決這個問題:

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); 
    } 
} 
+0

添加一些解釋和回答這個答案如何幫助OP在修復當前問題 –

+0

我讀了DeccelerateInterpolator的代碼。它實現了BaseInterpolator,女巫實現了Interpolator。 BaseInterpolator沒有添加任何抽象方法。這意味着這兩個類具有相同的抽象方法,名爲getInterpolation(float input)。我不知道爲什麼會顯示錯誤,但只要抽象方法相同,我們可以定義一個實現Interpolator的類幷包裝DecelerateInterpolator。因此沒有更多的錯誤顯示。 –