我对Java中的语法和规则不是很熟悉,所以这里有一个简单的问题:我为什么要写:
LayoutParams params = (LayoutParams) layout.getLayoutParams();
但我不能写:
LayoutParams params = layout.getLayoutParams();
在Obj-C中,我只需要编写
UIScrollView* abc = (UIScrollView*) [self.view viewWithTag:(1)];
从[self.view viewwithtag:(1)]
返回的对象不在abc
的预期类中(在这种情况下,它位于UIView
)。
相同的逻辑是否适用于Java?如果这是真的,那意味着从layout.getLayoutParams()
返回的对象不属于类LayoutParams
,这有点奇怪。
我的假设是正确的还是Java有不同的规则?
答案 0 :(得分:3)
你的假设是正确的。 getLayoutParams
必须返回一个不是LayoutParams
子类的类。方法名称命名很差,或者可能在不同的包中有两个不同的LayoutParams
类。您应该调查返回类型是什么,并确认它始终是您正在使用的LayoutParams
的子类,否则您将冒ClassCastException
的风险。
答案 1 :(得分:1)
LayoutParams params = (LayoutParams) layout.getLayoutParams();
在这里,您将layout.getLayoutParams();
返回的任何对象类型转换为LayoutParams
类型的实例。这称为缩小转换。如果getLayoutParams();
返回类LayoutParams
或其子类的实例,那么这将起作用或者它将失败。
答案 2 :(得分:0)
简短的回答:你不需要。
您需要这种情况的唯一情况是getLayoutParams()
返回更通用的类型并且您正在尝试缩小它。如果是这种情况,那么该方法的名称非常具有误导性 - 但它与Java的语法无关。
答案 3 :(得分:0)
你确实可以写
LayoutParams params = layout.getLayoutParams();
如果layout.getLayoutParams()
声明返回类型LayoutParams
的结果或LayoutParams
的子类。但是,如果声明返回LayoutParams
的超类(或接口),即使它实际返回LayoutParams
实例,它也不会起作用。在这种情况下,您需要cast
到LayoutParams
:
LayoutParams params = (LayoutParams)layout.getLayoutParams();
答案 4 :(得分:0)
如果layout.getLayoutParams()
方法的返回类型为LayoutParams
,则
LayoutParams params = layout.getLayoutParams();
这样可以正常工作。
但是如果返回类型是通用的(假设是LayoutParams
的接口或超类,但它实际上返回了LayoutParams
的对象),那么你必须输入强制转换为自动关闭在java中无法进行强制转换,您必须明确强制转换。
LayoutParams params = (LayoutParams) layout.getLayoutParams();
答案 5 :(得分:0)
不,就像你说的那样:如果结果与预期的课程不同,你必须按照(class)
进行更改。
在您的情况下,我相信getLayoutParams()
会返回ViewGroup.LayoutParams,因此您必须进行(class)
更改。
以下是对LayoutParam
答案 6 :(得分:0)
在这里走出困境,但我猜你在Android中正在谈论View.getLayoutParams()
。该方法返回ViewGroup.LayoutParams
。该类的文档告诉我们它有一堆子类:AbsListView.LayoutParams,
AbsoluteLayout.LayoutParams
,Gallery.LayoutParams
,ViewGroup.MarginLayoutParams
,ViewPager.LayoutParams
,WindowManager.LayoutParams
和更多。
因此,可能发生的情况是,您粘贴的代码范围中的 name LayoutParams
是指其中一个子类。 (也许你继承了AbsListView
,或者你/ IDE为它做了import static
。)所以你实际上必须插入强制转换,因为View.getLayoutParams()
的返回类型不是即使在运行时实际值可能是。
这是鼠标在IDE中的标识符应该确认的内容。
顺便说一下:无论是谁设计了一个涉及10个具有完全相同名称的类的API,都应该被拍摄。
答案 7 :(得分:0)
我怀疑你现在考虑参加考试:
class A
{
//assume that this class contain one method which is similar to your getLayout
public Object getObject()
{
return new A();
}
}
//现在首先要了解java中的一件事,即java中的每个类都是Object类的子类。现在看看这个返回stmt和方法签名,即签名是Object但是我们正在返回一个类对象,这在java中被称为upcasting。
下一步
现在,如果我们为A类对象访问此方法,那么我们需要向下转换 即 a1 =(A)getObject()// getObject()方法将返回Object类型,但我们使用downcast将该对象存储到A类对象中...