在我的应用程序中,我有以下类:

RestaurantDto

import android.os.Parcel
import android.os.Parcelable
import java.io.Serializable

class RestaurantDto() : Serializable, Parcelable {
var lat: Float = 0.toFloat()
var lng: Float = 0.toFloat()
var id: String? = null
var open_now: Boolean? = false
var weekdayText: Array<String>? = null
var name: String? = null
var place_id: String? = null
var rating: Float? = null
var vicinity: String? = null
var international_phone_number: String? = null
var website: String? = null
var reviews: Array<ReviewDto>? = null
var formatted_address: String? = null
var photoReferences: Array<PhotoReference>? = null
var image: ByteArray? = null

constructor(parcel: Parcel) : this() {
    lat = parcel.readFloat()
    lng = parcel.readFloat()
    id = parcel.readString()
    open_now = parcel.readValue(Boolean::class.java.classLoader) as? Boolean
    weekdayText = parcel.createStringArray()
    name = parcel.readString()
    place_id = parcel.readString()
    rating = parcel.readValue(Float::class.java.classLoader) as? Float
    vicinity = parcel.readString()
    international_phone_number = parcel.readString()
    website = parcel.readString()
    reviews = parcel.createTypedArray(ReviewDto.CREATOR)
    formatted_address = parcel.readString()
    photoReferences = parcel.createTypedArray(PhotoReference.CREATOR)
    image = parcel.createByteArray()
}

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeFloat(lat)
    parcel.writeFloat(lng)
    parcel.writeString(id)
    parcel.writeValue(open_now)
    parcel.writeStringArray(weekdayText)
    parcel.writeString(name)
    parcel.writeString(place_id)
    parcel.writeValue(rating)
    parcel.writeString(vicinity)
    parcel.writeString(international_phone_number)
    parcel.writeString(website)
    parcel.writeTypedArray(reviews, flags)
    parcel.writeString(formatted_address)
    parcel.writeTypedArray(photoReferences, flags)
    parcel.writeByteArray(image)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR : Parcelable.Creator<RestaurantDto> {
    override fun createFromParcel(parcel: Parcel): RestaurantDto {
        return RestaurantDto(parcel)
    }

    override fun newArray(size: Int): Array<RestaurantDto?> {
        return arrayOfNulls(size)
    }
}
}

ReviewDto

import android.os.Parcel
import android.os.Parcelable
import java.io.Serializable

class ReviewDto() : Serializable, Parcelable {
var author_name: String? = null
var author_url: String? = null
var language: String? = null
var profile_photo_url: String? = null
var rating: Int? = null
var text: String? = null
var time: Long? = null
var relative_time_description: String? = null

constructor(parcel: Parcel) : this() {
    author_name = parcel.readString()
    author_url = parcel.readString()
    language = parcel.readString()
    profile_photo_url = parcel.readString()
    rating = parcel.readValue(Int::class.java.classLoader) as? Int
    text = parcel.readString()
    time = parcel.readValue(Long::class.java.classLoader) as? Long
    relative_time_description = parcel.readString()
}

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeString(author_name)
    parcel.writeString(author_url)
    parcel.writeString(language)
    parcel.writeString(profile_photo_url)
    parcel.writeValue(rating)
    parcel.writeString(text)
    parcel.writeValue(time)
    parcel.writeString(relative_time_description)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR : Parcelable.Creator<ReviewDto> {
    override fun createFromParcel(parcel: Parcel): ReviewDto {
        return ReviewDto(parcel)
    }

    override fun newArray(size: Int): Array<ReviewDto?> {
        return arrayOfNulls(size)
    }
}
}

PhotoReference

import android.os.Parcel
import android.os.Parcelable
import java.io.Serializable

class PhotoReference() : Serializable, Parcelable{
var height: Int = 0
var width: Int = 0
var photo_reference: String? = null

constructor(parcel: Parcel) : this() {
    height = parcel.readInt()
    width = parcel.readInt()
    photo_reference = parcel.readString()
}

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeInt(height)
    parcel.writeInt(width)
    parcel.writeString(photo_reference)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR : Parcelable.Creator<PhotoReference> {
    override fun createFromParcel(parcel: Parcel): PhotoReference {
        return PhotoReference(parcel)
    }

    override fun newArray(size: Int): Array<PhotoReference?> {
        return arrayOfNulls(size)
    }
}
}

当我尝试从其他类创建一个新活动时,我收到错误消息

java.lang.RuntimeException:无法启动活动ComponentInfo {wizypay.brantner.wizy / wizypay.brantner.wizy.activities.AllRestaurantsBarsActivity}:java.lang.ClassCastException:android.os.Parcelable []无法强制转换为wizypay.brantner .wizy.models.RestaurantDto []在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2911)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2989)android.app.ActivityThread.-wrap11(未知来源) :0)在Android.app.Loper.loop(Looper.java:164)上的android.app.A活动线程中的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1688)处于android.os.Handler.dispatchMessage(Handler.java:106)在android.app.ActivityThread.main(ActivityThread.java:6753)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:482)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)引起:java.lang.ClassCastException:android.os.Parcelable []无法强制转换为wizyp ay.brantner.wizy.models.RestaurantDto []位于android.app的android.app.Activity.performCreate(Activity.java:7036)的wizypay.brantner.wizy.activities.AllRestaurantsBarsActivity.onCreate(AllRestaurantsBarsActivity.kt:25) . Activity.performCreate(Activity.java:7027)在android.app.Anstrumentation.callActivityCnate(Activitymentation.java:1231)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2864)android.app.ActivityThread.handleLaunchActivity(ActivityThread) .java:2989)在Android.app.Handler.dispatchMessage(Handler.java:)的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1688)的android.app.ActivityThread.-wrap11(未知来源:0) 106)在android.app.AooTloread.main(ActivityThread.java:6753)的android.os.Looper.loop(Looper.java:164)

我创建活动的方法:

public void onClick(View v) {
            Intent intent = new Intent(activity, AllRestaurantsBarsActivity.class);
            intent.putExtra("Restaurants", allRestaurants);
            intent.putExtra("Title", title);
            activity.startActivity(intent);

        }

allRestaurants是一系列的RestaurantDto(RestaurantDto [] allRestaurants)

在我的活动中,我有以下代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_all_restaurants_bars)

    val restaurants: Array<RestaurantDto> = intent.extras.getParcelableArray("Restaurants") as Array<RestaurantDto>
}}

有趣的是,当我将数组转换为数组列表时,一切正常 . 包含数组列表的代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_all_restaurants_bars)
    val restaurants: ArrayList<RestaurantDto> = intent.extras.getParcelableArrayList<RestaurantDto>("Restaurants") as ArrayList<RestaurantDto>
}}

public void onClick(View v) {
            Intent intent = new Intent(activity, AllRestaurantsBarsActivity.class);
            intent.putParcelableArrayListExtra("Restaurants", new ArrayList<RestaurantDto>(Arrays.asList(allRestaurants)));
            intent.putExtra("Title", title);
            activity.startActivity(intent);

        }

你能告诉我我的初始代码有什么问题,或者我的两次尝试之间的区别是什么?