-1

我正在研究原型设计模式我无法理解下面的语法。你能给我解释一下吗?将一个类放在括号中并像这样初始化是什么意思:

Person person2 = (Person) person1.doSomthing();

上下文中的代码:

// code in  int main
Person person1 = new Person("Fred");// this is understood
    System.out.println("person 1:" + person1);// this is understood
    Person person2 = (Person) person1.doClone();//not understood
    System.out.println("person 2:" + person2);// this is understood

java中的这种语法是否用于强制转换?

4

6 回答 6

9

这是一个演员表。换句话说,该doSomething()方法很可能没有声明为返回 a Person。因此,您需要先将返回的值转换为 a Person,然后再将其分配给person2.

如果doSomething确实返回 a Person,则不需要强制转换。

如果返回的对象的实际类型doSomething不可分配给 Person,则强制转换将ClassCastException在运行时抛出 a。

JLS #15.16中有关它的更多信息:

强制转换表达式在运行时将一种数值类型的值转换为另一种数值类型的相似值;或在编译时确认表达式的类型是布尔值;或在运行时检查引用值是否引用了其类与指定引用类型兼容的对象。

括号和它们包含的类型有时称为强制转换运算符。

于 2012-08-22T15:40:08.407 回答
4

这称为类型转换。您要说的是,您要确保 JVM 尝试强制该调用返回的任何类型的对象为Person.

assylias 没有提到的另一件事是它有两个附加功能:

  1. 如果实际返回的对象是 的子类Person,它会将返回值更改为Person。当您想确保实际使用任何子类时,这可能很有用,希望它的行为就像Person.
  2. 如果Person是一个接口,它将让您完全跳出该特定实现的继承层次结构并使用其他人的Person实现。这非常适合与像 Spring 这样的 API 一起使用,它允许您在构建时间之后配置类如何在安全配置等方面链接在一起。
于 2012-08-22T15:40:59.560 回答
2

它只是用来将它 ( person1.doSomthing()) 转换为Person类型。因为它可能不是返回Person类型,而是可以转换为Person类型的东西。

于 2012-08-22T15:39:41.430 回答
1

您正在将结果Person.doClone()转换为 type Person。大概Person.doClone()返回一个Object或类似的。

于 2012-08-22T15:40:20.343 回答
1
Person person2 = (Person) person1.doSomthing();

它将类型转换为对象从 person1.doSomthing() 返回的 Person 类型。

Person person2 = (Person) person1.doClone();

在这里,它克隆了 person1 对象,将其转换为 person 对象。

于 2012-08-22T15:43:12.133 回答
1

这是一个类型转换,以确保调用返回的对象类型是person1.doClone()type Person,以便可以将其分配给您的 person2 变量。

如果该doClone()方法是在Person类中定义的,我希望它返回一个类型为 的对象Person。在这种情况下,演员表是良性和不必要的。

但是,doClone()可以在 的超类中定义Person,并返回更通用的类型,因此可能需要缩小转换。

如果doClone不返回类型的实例Person(或 Person 继承层次结构中的某个其他类),则将java.lang.ClassCastException抛出 a 。

于 2012-08-22T15:48:45.723 回答