0

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

4

8 回答 8

3

你的假设是正确的。getLayoutParams必须返回一个不是LayoutParams. 方法名称命名不当,或者LayoutParams不同的包中有两个不同的类。您应该调查返回类型是什么,并确认它始终是LayoutParams您正在使用的子类,否则您将面临ClassCastException.

于 2013-05-07T11:46:05.387 回答
1
LayoutParams params = (LayoutParams) layout.getLayoutParams();

在这里,您将返回的任何 Object 类型转换layout.getLayoutParams();为 type 的实例LayoutParams。这称为缩小转换。如果返回类或其子类getLayoutParams();的实例,那么这将起作用或将失败。LayoutParams

于 2013-05-07T11:45:30.343 回答
0

在这里冒险,但我猜你在谈论View.getLayoutParams()Android。该方法返回一个ViewGroup.LayoutParams. 该类的文档告诉我们它有一堆子类:AbsListView.LayoutParams, AbsoluteLayout.LayoutParams, Gallery.LayoutParams, ViewGroup.MarginLayoutParams, ViewPager.LayoutParams, WindowManager.LayoutParams, 等等。

因此,可能发生的情况是您粘贴的代码范围内的名称 LayoutParams引用了这些子类之一。(也许您正在继承AbsListView,或者您/IDEimport static为它做了一个。)所以您实际上必须插入强制转换,因为返回类型View.getLayoutParams()不能分配给它的任何子类,即使在运行时实际值可能是。

将鼠标悬停在 IDE 中的标识符上应该可以确认这一点。

顺便说一句:设计一个涉及 10 多个具有完全相同名称的类的 API 的人应该被枪决。

于 2013-05-07T11:50:41.450 回答
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 中称为向上转换。

下一个

现在,如果我们为 A 类对象访问此方法,那么我们需要向下转换,即 A a1=(A)getObject()//getObject() 方法将返回 Object 类型,但我们通过使用向下转换将该对象存储到 A 类对象中。 ..

于 2013-05-07T11:55:25.367 回答
0

如果方法的返回类型layout.getLayoutParams()LayoutParamsthen

LayoutParams params = layout.getLayoutParams();

这将正常工作。

但是,如果返回类型是通用的(假设一个接口或超类,LayoutParams但它实际上返回了 的对象LayoutParams)在这种情况下,您必须键入强制转换,因为在 java 中无法进行自动向下强制转换,您必须显式强制转换

LayoutParams params = (LayoutParams) layout.getLayoutParams();
于 2013-05-07T11:48:02.750 回答
0

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

在您的情况下,我相信getLayoutParams()返回 ViewGroup.LayoutParams,因此您必须进行(class)更改。

这是对LayoutParam的解释

于 2013-05-07T11:49:34.430 回答
0

简短的回答:你不需要。

唯一需要这个的情况是如果getLayoutParams()返回一个更通用的类型并且你试图缩小它。如果是这种情况,那么该方法的名称非常具有误导性 - 但它与 Java 的语法无关。

于 2013-05-07T11:47:24.090 回答
0

你确实可以写

 LayoutParams params = layout.getLayoutParams();

iflayout.getLayoutParams()声明返回类型的结果LayoutParams,或者 的子类LayoutParams。但是,如果声明返回 的超类(或接口),它将不起作用LayoutParams,即使它实际上正在返回一个LayoutParams实例。cast在这种情况下,您需要LayoutParams

 LayoutParams params = (LayoutParams)layout.getLayoutParams();
于 2013-05-07T11:47:41.130 回答