由以下原因引起:java.lang.ClassCastException:android.app.Application无法转换为com.example.myapp.MainActivity

时间:2019-02-13 19:23:20

标签: android android-studio

启动应用时在logcat中出现错误。下面是logcat和Java代码,我已经在stackover流中检查了此问题,但是找不到解决方案。

  

MainActivity.Java

public class MainActivity extends AppCompatActivity {
    public boolean toasted = false;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!((MainActivity) getApplicationContext()).toasted) {  (MainActivity.java:28)
            Toast.makeText(MainActivity.this, "Welcome" , Toast.LENGTH_LONG).show();
            ((MainActivity)getApplicationContext()).toasted = true;
        }
}
  

Logcat

Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to com.example.counter.MainActivity
        at com.example.myapp.MainActivity.onCreate(MainActivity.java:28)

3 个答案:

答案 0 :(得分:0)

您尝试将getApplicationContext()下传到MainActivity。

getApplicationContext()为您提供应用程序的上下文,它不是Activity的一部分。

如果您需要在活动中保存变量,请使用 this.toasted = true

答案 1 :(得分:0)

为什么要强制将getApplicationContext()强制转换为MainActivity? 您应该获得这样的上下文

  This.getApplicationContext();

答案 2 :(得分:0)

解决方案:

public class MainActivity extends AppCompatActivity {
    public boolean toasted = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!toasted) {  
            Toast.makeText(MainActivity.this, "Welcome" , Toast.LENGTH_LONG).show();
            toasted = true;
        } 
    }

此问题是由您尝试将Application转换为Activity引起的。

这根本不可能,因为在投射时,必须遵循某些规则。

ApplicationActivity都可以转换为Context,因为它们都是Context类的子级。

但是,如果您还记得Java中的继承规则,则可以将子类的实例强制转换为其父类,而将父类的实例强制强制转换为其子类原来是那个孩子班。

因此,当您使用getApplicationContext()时,您将获得Application的上下文,而不是Activity。这就是为什么强制转换为MainActivity的原因,因为MainActivityAppCompatActivity的子级,而ActivityApplication的子级,与MainActivity完全不同。

您也没有理由要求强制转换以执行所需的操作。您目前位于text类中,因此可以直接访问它的实例变量。无需执行其他操作即可获取上下文,对其进行强制转换,只需将新变量分配给您已经可以访问的变量即可。