在java中混淆引用转换和扩展w.r.t对象
通过原语和它们的包装,我理解了加宽的概念。但对于其他对象,我对加宽和隐式投射感到困惑。举例来说在java中混淆引用转换和扩展w.r.t对象,java,Java,通过原语和它们的包装,我理解了加宽的概念。但对于其他对象,我对加宽和隐式投射感到困惑。举例来说 Class Animal{ } Class Dog extends Animal{ public static void main(args String[]){ Dog d = new Dog(); d.go(d); } void go(Animal a){
Class Animal{
}
Class Dog extends Animal{
public static void main(args String[]){
Dog d = new Dog();
d.go(d);
}
void go(Animal a){ }
}
编辑:问题是哪一个是首选加宽或浇铸,以及为什么?(在我看来)如果不需要浇铸,那么就不要这样做。您的代码将更具可读性
特别是,语法:
d.go(d);
更简洁,也更准确
d.go((Animal)d);
基本上,我在下面第一次尝试回答您的问题时所描述的原因是,利用这种扩大
这取决于您希望代码完成什么 如果你想要一个能处理任何动物、狗或其他动物的函数,那么你应该把动物作为输入 如果你想要一个只需要狗才能拥有的功能,或者一个只需要狗作为输入的操作,那么你应该把狗作为输入 编辑:也许一个更人为的例子可以说明为什么这个问题没有一个简单的通用答案。在Java中,所有对象都是对象的子对象,因此,任何方法都可以编写为接受参数
objectfoo
有时这可能很有用,但它的用例实际上非常有限,您仅限于对象上定义的方法
相反,假设您知道狗
,它也是一个对象
。与其将Dog
的实例作为对象传递
,您可能需要获取特定于Dog
的某些属性。基本上,如果您需要确保某个函数的参数符合某个约定,那么您应该将参数限制为符合的类型——稍微不同:如果您需要知道它是一只狗,那么就声明它是一只狗
一般来说,你应该(在我看来)选择符合你需要履行的任何合同的“最宽”类型。如果你需要知道它是一种动物,那就宣布它是一种动物。我同意马克的说法,那要看情况而定。我使用了一条经验法则,基本上就是说,将声明的类型强制转换为子类型是“不好的”。所以如果在你的方法中
void go(动物a){…}
你需要像这样的演员
dogd=(Dog)a代码>
您应该明确(如果可能)将Animal类型的参数更改为Dog类型的参数。如果该方法适用于动物
的所有子类型,而不使用石膏,则保持原样。我不明白你想说什么。在上面的例子中,我问过哪个是首选项。@gurukulki,任何“首选项”都取决于您的代码需要完成什么(这里没有通用的答案)。我举了一些例子,说明什么时候加宽是首选,什么时候窄是首选。但我问什么时候加宽是首选,什么时候浇铸是首选preferred@gurukulki,事实上,我的第一次传球似乎完全没有击中目标,经过了适当的编辑。