2012-01-06 103 views
12

我知道投射只能从子类到超类(上投)完成,但此示例说明了我想要执行的操作。将超类的对象投射到子类 - 向下投射

Class Super {} 
Class Sub extends Super {} 

Super super = new Super(); 
Sub sub = (Sub)super; 

我相信这是因为这是不允许的那么“向下”铸...

什么是创建给定类型超级的对象类型分的目标的最佳方式提及。

编辑:

这是问题 - 什么是对动物转化成猫的最佳途径。

答案?从一个基本类型的动物开始,并将属性复制到猫。添加毛皮和尾巴等。基本上是一个拷贝构造函数。这是正确的答案(还是很好的答案)?

ANOTHER编辑:

我想我的问题是很清楚的,但也许是过于笼统。要求采取“最佳”方式做某些事情往往会给出很多不同的答案。我意识到在不同情况下最好的方式可能会有所不同。

我不是在寻找关于Java或OO基础知识的教程。只是在征求意见,以便我可以解决这个问题,因为我已经用最佳实践概述了它。

+0

从你的问题来看,你不清楚你知道什么,你不知道什么。所以,当人们回答*时,不要感到惊讶,我相信这被称为“下来”投射,这是不允许的*部分而不是(非常模糊的)“实际问题。”是的,复制构造函数就是这样。不,它不是唯一的,工厂方法会很好。不,这不是最好的 - 我们不知道你有什么限制和假设。 – alf 2012-01-06 13:36:26

+0

@alf我可以告诉你我的问题很清楚 - 你能否就如何在一般情况下提出问题提供更多建议?我希望能够问一个问题,增加网站的价值,并获得有价值的回应,但在这种情况下,似乎我有一种失败......误解,低调,我最终有点沮丧。 – Matthew 2012-01-06 13:44:49

+1

好吧,我可以看到选票的细分,并且没有票下来。没有投票,但那不是重点,是吗?标准的HOWTO应该是http://catb.org/~esr/faqs/smart-questions.html - 这很好,关键点。在目前的问题上,我会说责怪那些试图帮助的人不是一个很有创意的想法;说明你的问题很清楚,当你需要两次编辑是非常接近的责备,只有少数人会注意到这种差异。在这里添加“感谢您实际阅读我的问题”,您将获得公平的侵略性。善待。修复错误。不要责怪 – alf 2012-01-06 13:52:08

回答

9

A CatAnimal

如果我给你一只动物(不一定是猫),你会如何将它转换成一只猫?

编辑:

有一种方法可以做任何事情。大多数时候,你不应该。我相信一个更好的设计可以消除向下转换的需要。但你可以:

  • Super一个构造函数一个Sub作为参数。

  • 实现了Super的工厂,并且具有以Sub作为参数的方法。

我建议你扩大你的问题,告诉我们你需要什么,因为我真的认为一个更优雅的解决方案存在。

+2

@Matthew - 仅仅因为有办法做到这一点,并不意味着你应该这样做。静态你想达到的效果会更好。向下转换很少是答案,我肯定有一个更好的解决方案存在于你的案例中。 – 2012-01-06 13:17:19

+0

感谢您的回答。我可能只是做一些研究,并确切地找出在这种情况下我可能需要的东西,并提出更详细和具体的问题。这肯定会做我现在需要的,因为我只是要求一个普遍的答案,但我知道我会遇到一种情况,我需要稍后更具体的东西。 – Matthew 2012-01-06 14:30:25

1

编辑:从你的问题来看,它并不完全清楚你知道什么,你不知道什么。所以,当人们回答

我相信这是因为这是不允许的

一部分,而不是(很模糊)“下”铸造简称不要感到惊讶,“实际问题”。

是的,复制构造函数就是这样。

不,它不是唯一的,工厂方法会做得很好。

不,这不是最好的 - 我们不知道你有什么限制和假设。


旧版本: 铸件可以做到无论哪种方式,与向上转型是通常是不必要的(除非你需要选择一个特定的重载方法)。

通常没有办法创建一个类型为Sub的对象,只要创建一个基于来自给定数据的新对象的方法,就可以创建一个Super类型的对象。

为了投射,您必须确保您投射的对象实际上是您投射到的类型(或其子类型)。

+0

我明确指出,我知道上铸是允许的,我知道下铸没有。通过询问给出这些信息的x的最佳方式,我完成了它。我现在有点修辞 - 我怎么不清楚? – Matthew 2012-01-06 13:56:46

+1

@Matthew,向下*是*允许的。目前还不清楚你是否知道“downcasting”是什么,因为它确实被允许,所以它可能是通常的“vs vs哪个”问题或缺乏理解。根据以往的经验,许多人认为缺乏了解。 – alf 2012-01-06 14:02:16

+0

我想我可以说:“我知道在这种特殊情况下不允许铸造”......“。 – Matthew 2012-01-06 14:17:37

5

如果实际对象是“Sub”类型,则只能向下倾倒。 例如:

Super subAsSuper = new Sub(); 
Sub sub = (Sub)subAsSuper 

你的方式是行不通的,因为超未分的子类。所以你会得到一个运行时错误。

5

您可以将一个构造函数添加到Sub类中,该类将Super对象作为参数。

0

把这个想法记 -

Class Super {} 
Class Sub { 
    public Super super = new Super(); 
} 

Sub sub = new Sub(); 
sub.super = super; 

我做了一个非常简单的例子在这里,但你可以去任何你想要这个,你可以把它的工作相同像继承。不管怎样,它都不会返回任何错误。