Java 如何像使用父对象一样使用子对象?

Java 如何像使用父对象一样使用子对象?,java,Java,我有一组Java类,作为工具包使用,可以插入到许多项目中。我不想更改此工具包中的代码,因此,无论何时更新或修复错误,我都可以将其放入使用它的任何项目中,而无需担心本地更改。因此,如果任何本地项目需要覆盖toolkit中的方法,我只需要创建toolkit对象的本地版本,如下所示: 文件:toolkit/Dog() 文件:local/Dog() 在本地对象中,我指的是本地Dog对象,而不是toolkitDog对象 到目前为止,这个方法效果很好,但我遇到了一个问题。工具箱中的另一个类使用Dog 文件:

我有一组Java类,作为工具包使用,可以插入到许多项目中。我不想更改此工具包中的代码,因此,无论何时更新或修复错误,我都可以将其放入使用它的任何项目中,而无需担心本地更改。因此,如果任何本地项目需要覆盖toolkit中的方法,我只需要创建toolkit对象的本地版本,如下所示:

文件:toolkit/Dog()

文件:local/Dog()

在本地对象中,我指的是本地
Dog
对象,而不是toolkit
Dog
对象

到目前为止,这个方法效果很好,但我遇到了一个问题。工具箱中的另一个类使用
Dog

文件:工具箱/DogHandler

public void careForPack( List<Dog> arg_allTheDogs ){
  for( Dog fido : arg_allTheDogs ){
    fido.pet();
  }
}
public void careForPack(列出所有日志){
用于(狗fido:arg_所有的狗){
fido.pet();
}
}
出现的问题是系统不喜欢这些对象不是相同的
Dog
对象。我不想在本地重写
DogHandler
,因为我最终只会重写我的整个工具包,这与目的背道而驰


狗处理程序
是否有办法识别
的子对象(也称为
)是有效的?

您应该让您的工具箱方法接受一个
列表
,其中包含扩展
toolkit.Dog
类型的对象。您可以使用
?为此扩展T

public void careForPack( List<toolkit.Dog> arg_allTheDogs )
{
   for( local.package.name.Dog fido : arg_allTheDogs )
   {
       fido.pet();
   }
}
public void careForPack( List<? extends toolkit.Dog> arg_allTheDogs ){
  for( toolkit.Dog fido : arg_allTheDogs ){
    fido.pet();
  }
}

public void careForPack(List您应该让您的工具箱方法接受一个
列表
,其中包含扩展
toolkit.Dog
类型的对象。您可以使用
?extends T
实现此目的:

public void careForPack( List<? extends toolkit.Dog> arg_allTheDogs ){
  for( toolkit.Dog fido : arg_allTheDogs ){
    fido.pet();
  }
}


public void careForPack(列表通过完整的类名来限定它……Dog应该会帮你。
public void careForPack(列出arg_所有的dogs){
?我想他想在方法签名中使用toolkit.Dog,但在方法体中使用实际的本地Dog。我不够清楚。在本地代码中,我需要调用toolkit.DogHandler.careForPack()使用列表参数并使其工作。列表中的元素扩展
toolkit/Dog
就足够了吗?在这种情况下,您可以使用
List通过完整的类名对其进行限定…Dog应该为您完成此任务。
public void careForPack(List arg\u allTheDogs){
?我想他想在方法签名中使用toolkit.dog,但在方法体中使用实际的本地dog。我不够清楚。在本地代码中,我需要调用toolkit.DogHandler.careForPack()使用列表参数并使其工作。列表中的元素扩展
toolkit/Dog
是否足够?在这种情况下,可以使用
ListI。我不够清楚。在本地代码中,我需要调用toolkit.DogHandler.careForPack()使用List参数并使其工作。ooooh,听起来您想要闭包;您想要本地重写toolkit.DogHandler.careForPack()要使用local.Dog而不是toolkit.Dog?请等待Java7或接口代码。例如,不要简单地扩展Dog,而是创建一个接口IToolkitDog,由本地Dog实现,并将处理程序更改为使用List而不是List…这将使您能够同时使用toolkit Dog和本地Dog。不,不会。使用接口将导致exac同样的问题。闭包与此无关。Java 7已经存在很长一段时间了。正如Mattias Buelens在评论中解释的,参数应该是一个
列表。我不够清楚。在本地代码中,我需要调用toolkit.DogHandler.careForPack()使用List参数并使其工作。ooooh,听起来您想要闭包;您想要本地重写toolkit.DogHandler.careForPack()要使用local.Dog而不是toolkit.Dog?请等待Java7或接口代码。例如,不要简单地扩展Dog,而是创建一个接口IToolkitDog,由本地Dog实现,并将处理程序更改为使用List而不是List…这将使您能够同时使用toolkit Dog和本地Dog。不,不会。使用接口将导致exac同样的问题。闭包与此无关。Java 7已经存在很长一段时间了。正如Mattias Buelens在评论中解释的那样,参数应该只是一个
列表,而不是所要求的。他需要careForPack使用本地狗…我建议使用一个接口,而不是运行时数据类型评估…我derped,我编写了
super我的意思是扩展
。感谢忍者编辑,@JBNizet!:)谢谢你,这很有帮助。实现了它,而且它很有效。在我得到15个代表之前不能升级投票,但如果可以的话我会升级的!@MattiasBuelens Hrm。当然,现在我还需要从另一个
狗处理程序
方法返回一个
列表
,看起来我需要使用工厂…如果你有关于在哪里查找的建议,我会的非常高兴。@WolfmanJoe,这个列表将如何生成?如果你需要创建新的
Dog
s,那么你确实需要某种工厂类。不过,你可以用
T extensed Dog
来定义它,这样它将生成一个
T
。如果你需要更多的帮助或支持,只需进行新的探索离子.-)不是问他什么。他需要careForPack来使用本地狗…我建议使用一个接口,而不是运行时数据类型评估…我读了,我写了
super
,我的意思是
extends
。感谢忍者编辑,@JBNizet!:)谢谢你,这很有帮助。实现了它,它很有效。在我得到15个代表之前不能投票,但我会的如果可以的话!@MattiasBuelens Hrm。当然,现在我还需要从另一个
DogHandler
方法返回一个
列表
,看起来我需要使用工厂……如果你有关于在哪里查找的建议,我会非常高兴。@WolfmanJoe好吧,这个列表将如何生成?如果你需要创建新的
s,那么您确实需要某种因素
//we need an interface to have datatype interchangability
public class Toolkit.Dog implements IToolkitDog
{
    public void pet()
    {
        print("toolkit dog says what");
    }
}

//we inherit the IToolkitDog from Toolkit.Dog
public class local.Dog extends Toolkit.Dog 
{
     public void pet()
     {
         print("rub ears");
     }
}


//both toolkit.dog and local.dog are of type IToolkitDog 
public void careForPack( List<IToolkitDog> arg_allTheDogs )
{
    for( local.Dog fido : arg_allTheDogs )
    {
       fido.pet();
    }
}
public interface IToolkitDog
{
     pet();
//...
}
public void careForPack( List<? extends toolkit.Dog> arg_allTheDogs ){
  for( toolkit.Dog fido : arg_allTheDogs ){
    fido.pet();
  }
}