我正在研究Prototype Design模式我无法理解下面的语法。你能解释一下吗?将一个类放入括号并以这样的方式初始化是什么意思:
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中用于转换吗?
答案 0 :(得分:9)
这是演员。换句话说,doSomething()
方法很可能不会被声明为返回Person
。因此,您需要先将返回的值转换为Person
,然后再将其分配给person2
。
如果doSomething
确实返回Person
,则无需投射。
如果doSomething
返回的对象的实际类型不能赋予Person,则转换将在运行时抛出ClassCastException
。
有关JLS #15.16的更多信息:
强制转换表达式在运行时将一个数值类型的值转换为另一个数字类型的类似值;或者在编译时确认表达式的类型是boolean;或者在运行时检查引用值是指其类与指定引用类型兼容的对象。
括号及其包含的类型有时称为强制转换运算符。
答案 1 :(得分:4)
它被称为type casting。你要说的是你要确保JVM试图强制该调用返回的任何类型的对象都是Person
。
assylias没有提到的另一件事是它有两个额外的功能:
Person
的子类,它会将返回的值更改为Person
。当你想确保实际使用的是什么子类时,这可能很有用,它希望表现得像Person
。Person
是一个接口,它将允许您完全脱离该特定实现的继承层次结构,并使用其他人的Person
实现。这非常适合与Spring一起使用,它允许您在构建时间之后配置如何将类链接在一起,如安全配置等。答案 2 :(得分:2)
它只是用于将其(person1.doSomthing()
)强制转换为Person
类型。因为它可能没有返回Person
类型,而是可以投放到Person
类型的内容。
答案 3 :(得分:1)
您将Person.doClone()
的结果转换为类型Person
。大概Person.doClone()
会返回Object
或类似内容。
答案 4 :(得分:1)
Person person2 = (Person) person1.doSomthing();
它将类型转换为从Person1.doSomthing()返回的Person类型。
Person person2 = (Person) person1.doClone();
这里克隆了person1对象,将其转换为person对象。
答案 5 :(得分:1)
这是一个类型转换,以确保从调用person1.doClone()
返回的对象类型的类型为Person
,以便可以将其分配给您的person2变量。
如果在doClone()
类中定义了Person
方法,我希望它返回类型为Person
的对象。在这种情况下,演员阵容是良性的,没有必要。
但是,doClone()
可以在Person
的超类中定义,并返回更通用的类型,因此可能需要缩小范围。
如果doClone
没有返回类型为Person
的实例(或Person的继承层次结构中的其他类),则会抛出java.lang.ClassCastException
。