我有一组Java类,我正在使用它作为工具包,我可以插入许多项目。我不想更改此工具包中的代码,因此每次更新或修复错误时,我都可以将其放入我正在使用它的任何项目中,而无需担心本地更改。因此,如果任何本地项目需要覆盖工具箱中的方法,我只需创建工具包对象的本地版本,如下所示:
文件:工具包/狗()
public class Dog(){
public void pet(){
print("scratch ruff");
}
}
文件:本地/狗()
public class Dog extends toolkit/Dog {
public void pet(){
print("rub ears");
}
}
在本地对象中,我引用了本地Dog
对象而不是工具箱Dog
对象。
到目前为止这种方法效果很好,但我遇到了一个问题。工具包中的另一个类使用Dog
。
FILE:toolkit / DogHandler
public void careForPack( List<Dog> arg_allTheDogs ){
for( Dog fido : arg_allTheDogs ){
fido.pet();
}
}
出现的问题是系统不喜欢这些Dog
对象不同。我不想在本地覆盖DogHandler
,因为我最终会覆盖我的整个工具包,而这会违背目的。
DogHandler
是否有办法识别Dog
的孩子(也称为Dog
)是否有效?
答案 0 :(得分:4)
您应该让您的工具包方法接受包含扩展 List
类型的对象的toolkit.Dog
。您可以使用? extends T
:
public void careForPack( List<? extends toolkit.Dog> arg_allTheDogs ){
for( toolkit.Dog fido : arg_allTheDogs ){
fido.pet();
}
}
答案 1 :(得分:0)
public void careForPack( List<toolkit.Dog> arg_allTheDogs )
{
for( local.package.name.Dog fido : arg_allTheDogs )
{
fido.pet();
}
}
编辑:也许这个?
//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();
//...
}