为什么我需要=(class)...当我已经宣布了这个类?

时间:2013-05-07 11:41:44

标签: java objective-c

我对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有不同的规则?

8 个答案:

答案 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实例,它也不会起作用。在这种情况下,您需要castLayoutParams

 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.LayoutParamsGallery.LayoutParamsViewGroup.MarginLayoutParamsViewPager.LayoutParamsWindowManager.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类对象中...