方法ViewGroup.addView
的第二个参数是ViewGroup.LayoutParams
。在许多情况下,您希望使用诸如RelativeLayout.LayoutParams
之类的子类,但令人讨厌的是方法签名中没有类型安全性,因此以下所有内容都编译并且显然有效。
relativeLayout.addView(textView, new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
relativeLayout.addView(textView, new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
relativeLayout.addView(textView, new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
这让我有点担心,因为它很容易意外地提供错误的类型。 (我无法理解为什么它是这样设计的,但这不是我的问题。)
显然,当ViewGroup
布局时,所有孩子的LayoutParams
必须在某些时候被投射到适当的类型,以便阅读任何额外的规则。我是否可以确定ViewGroup
的所有标准子类都是所有这些强制类型转换(即跟随instanceof
),因此如果我提供了错误的类型,我将永远不会得到{ {1}}在运行时?
答案 0 :(得分:0)
我可以确定ViewGroup的所有标准子类都是所有这些强制类型转换(即跟随一个instanceof),这样如果我提供了错误的类型,我将永远不会在运行时获得ClassCastException吗?
我向你保证并非如此,至少在某些情况下并非如此。提示ClassCastExceptions
提供错误的LayoutParams
类型肯定会发生,因为当人们遇到这种情况时,我必须在Stack Overflow上回答相当多的问题。
话虽如此,在大多数情况下,此异常确实表明编码错误(与用户可能以某种方式触发的内容相比)。
如果您的问题是“对addView()
的子类ViewGroup
检查输入的类型是否合适?”,则答案通常为“否”,因为像RelativeLayout
这样的类不会覆盖{ {1}}但只使用addView()
中的继承实现。