Java 为什么我需要=(类)。。。我什么时候已经申报了?

Java 为什么我需要=(类)。。。我什么时候已经申报了?,java,objective-c,Java,Objective C,我不太熟悉Java中的语法和规则,所以这里有一个简单的问题:为什么我要写: LayoutParams params = (LayoutParams) layout.getLayoutParams(); 但我不会写: LayoutParams params = layout.getLayoutParams(); 在Obj-C中,我只需要编写 UIScrollView* abc = (UIScrollView*) [self.view viewWithTag:(1)]; 当从[self.vie

我不太熟悉Java中的语法和规则,所以这里有一个简单的问题:为什么我要写:

LayoutParams params = (LayoutParams) layout.getLayoutParams();
但我不会写:

LayoutParams params = layout.getLayoutParams();
在Obj-C中,我只需要编写

UIScrollView* abc = (UIScrollView*) [self.view viewWithTag:(1)];
当从
[self.view view with tag:(1)]
返回的对象不在
abc
的预期类中时(在这种情况下,它位于
UIView

同样的逻辑适用于Java吗?如果这是真的,那意味着从
layout.getLayoutParams()
返回的对象不属于类
LayoutParams
,这有点奇怪

那么,我的假设是否正确,或者Java是否有不同的规则

LayoutParams params = (LayoutParams) layout.getLayoutParams();
这里您正在对
layout.getLayoutParams()返回的任何对象进行类型转换
LayoutParams
类型的实例。这称为缩小转换。如果
getLayoutParams()
返回类
LayoutParams
或其子类的实例,则此操作将起作用或失败


这里您正在对
layout.getLayoutParams()返回的任何对象进行类型转换
LayoutParams
类型的实例。这称为缩小转换。如果
getLayoutParams()
返回类
LayoutParams
或其子类的实例,然后这将起作用或失败。

您的假设是正确的
getLayoutParams
返回的类必须不是
LayoutParams
的子类。要么方法名称命名不当,要么可能在不同的包中有两个不同的
LayoutParams
类。您应该调查返回类型,并确认它始终是您正在使用的
布局参数的子类,否则您将面临
类异常的风险

您的假设是正确的
getLayoutParams
返回的类必须不是
LayoutParams
的子类。要么方法名称命名不当,要么可能在不同的包中有两个不同的
LayoutParams
类。您应该调查返回类型是什么,并确认它始终是您正在使用的
LayoutParams
的子类,否则您将面临
ClassCastException
的风险。简短回答:您不需要这样做


如果
getLayoutParams()
返回一个更通用的类型,并且您正在尝试缩小它,那么您就需要这样做。如果是这样的话,那么该方法的名称是非常容易误导的——但它与Java的语法无关。

简短回答:您不需要这样做

如果
getLayoutParams()
返回一个更通用的类型,并且您正在尝试缩小它,那么您就需要这样做。如果是这样的话,那么该方法的名称是非常容易误导的——但它与Java的语法无关。

您确实可以编写

 LayoutParams params = layout.getLayoutParams();
如果
layout.getLayoutParams()
声明返回类型为
LayoutParams
的结果,或
LayoutParams
的子类。但是,如果声明返回
LayoutParams
的超类(或接口),即使它实际返回的是
LayoutParams
实例,它也不起作用。在这种情况下,您需要将它转换为
LayoutParams

 LayoutParams params = (LayoutParams)layout.getLayoutParams();
你确实可以写作

 LayoutParams params = layout.getLayoutParams();
如果
layout.getLayoutParams()
声明返回类型为
LayoutParams
的结果,或
LayoutParams
的子类。但是,如果声明返回
LayoutParams
的超类(或接口),即使它实际返回的是
LayoutParams
实例,它也不起作用。在这种情况下,您需要将它转换为
LayoutParams

 LayoutParams params = (LayoutParams)layout.getLayoutParams();

如果
layout.getLayoutParams()
方法的返回类型为
LayoutParams
,则

LayoutParams params = layout.getLayoutParams();
这很好用

但是如果返回类型是常规的(假设一个接口或超类为
LayoutParams
,但它实际返回的对象为
LayoutParams
),那么在这种情况下,您必须键入cast,因为自动向下转换在java中是不可能的,您必须显式地强制转换

LayoutParams params = (LayoutParams) layout.getLayoutParams();

如果
layout.getLayoutParams()
方法的返回类型为
LayoutParams
,则

LayoutParams params = layout.getLayoutParams();
这很好用

但是如果返回类型是常规的(假设一个接口或超类为
LayoutParams
,但它实际返回的对象为
LayoutParams
),那么在这种情况下,您必须键入cast,因为自动向下转换在java中是不可能的,您必须显式地强制转换

LayoutParams params = (LayoutParams) layout.getLayoutParams();

不,正如您所说:如果结果与预期的类不同,您必须根据
(类)


更改它 在您的情况下,我认为
getLayoutParams()
返回ViewGroup.LayoutParams,因此您必须进行
(类)
更改。


下面是对

否的解释,正如您所说:如果结果与预期的类不同,您必须根据
(类)


更改它 在您的情况下,我认为
getLayoutParams()
返回ViewGroup.LayoutParams,因此您必须进行
(类)
更改。


这里有一个关于

的解释,但我猜你说的是安卓系统。该方法返回一个。该类的文档告诉我们它有一系列子类:
AbsListView.LayoutParams,
Gallery.LayoutParams
ViewGroup.MarginLayoutParams
ViewPager.LayoutParams
WindowManager.LayoutParams
,等等

因此,可能发生的情况是,您粘贴的代码范围中的名称
LayoutParams
引用了这些子类之一。(可能您继承了
AbsListView
,或者您/IDE为它做了一个
导入静态