【问题标题】:Type argument is not within its bounds Expected: Parcelable Found: String类型参数不在其范围内预期:Parcelable 找到:字符串
【发布时间】:2020-04-27 15:33:09
【问题描述】:

我正在创建一个像这样的通用抽象类:

abstract class BaseDialogFragment<T: Parcelable> : DialogFragment()

试图将这个类实现为

class MyDialogFragment : BaseDialogFragment<String>()

给我

Type argument is not within its bounds Expected: Parcelable Found: String

BaseDialogFragment&lt;String&gt;() 中的字符串。

那么,如何使用String 作为T 的值?如果我希望 T 成为可包裹类型,我的条件 T: Parcelable 是否有问题?

【问题讨论】:

  • 恐怕你能做到。但是,您可以尝试在编译时允许每个类型,然后在运行时(在 init 块内)您可以尝试使用速记内联函数(如require)来验证这些内容。编辑:在运行时有类型擦除。抱歉,您无法检查泛型参数的类型。 :(
  • 不幸的是,我的 T 稍后被用作使用 @Parcelize 进行 Parcelable / parcelized 的类的泛型类型参数。在无条件使用T 时,出现错误。
  • Type is not directly supported by 'Parcelize'. Annotate the parameter type with '@RawValue' if you want it to be serialized using 'writeValue()'
  • 是的,很遗憾你不能这样做。

标签: android generics kotlin parcelable


【解决方案1】:

那么,如何使用 String 作为 T 的值?

你不能。 String 不是Parcelable,因为Parcel 已经知道如何处理String。同样,您不能将ByteArray 用于TIntBoolean

【讨论】:

  • 很遗憾,但至少我知道为什么):谢谢!
  • @stefan.at.wpf:是的,我能提供给你的最好的方法是将字符串包装在 Parcelable 类型中,例如 data class@Parcelize
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 2018-01-22
  • 2021-09-24
  • 2021-09-21
相关资源
最近更新 更多