在android中,静态匿名内部类可以作为可序列化传递吗?

时间:2015-01-29 04:40:17

标签: android

static interface A extends Serializable{void a();}

Intent it = new Intent(WelcomeActivity.this, c); 
it.putExtra("simplekey", new A(){
                @Override
                public void a() {

                }

            });
startActivity(it);

这会引发IOexception

not serializable object(XX.XXXAcitivty$1$1)

1 个答案:

答案 0 :(得分:1)

不,它不能,因为你不能首先将匿名内部类声明为静态。

将接口声明为静态不会使实现它的类成为静态,因为静态关键字在应用于接口时完全是冗余的,因为接口无法实例化。您可以将所有接口声明视为隐式包含static关键字。所以在上面的例子中,你传递的是一个非静态的匿名内部类。

但是,您可以声明一个静态内部类并将其作为Serializable传递,如下所示:

// this static keyword doesn't make any difference:
static interface A extends Serializable{void a();}
// this static keyword DOES make a difference:
static class B implements A
{
    private static final long serialVersionUID = 1L;            
    @Override
    public void a() {

    }
}

Intent it = new Intent(WelcomeActivity.this, c); 
it.putExtra("simplekey", new B());
startActivity(it);

B是一个静态类,它扩展了Serializable,因此没有错误。匿名内部类A(){public void a()}不是静态的,因此即使它扩展了Serializable也会导致错误,因为它将引用一个无法序列化的外部类。