如何在不定义超类或接口的情况下在Java中定义通用类型



我有一个方法,它将Object作为参数。

public String toStr(Object o) {}

有两种工厂方法可以生成两个不同的实例。

A a = FactoryA.generate() 
B b = FactoryB.generate()

在我的代码中,

Object y;
If (x) {
y = FactoryA.generate() 
} else {
y = FactoryB.generate()
}
toStr(y)

有没有一种方法可以为a和B定义一个公共类型,这样我就可以将该公共类型传递给toStr(),而不是使用Object,因为我想要一个更具体的类型而不是Object来进行类型检查。如果类A和B有共同的方法或字段,我会创建一个超类C或接口C,这样我就可以用C替换Object。但A和B没有共同的方法和字段。在这种情况下,定义a和B的通用类型的最佳方法是什么?空接口或空抽象类是最好的方法吗?

如何在Java中定义公共类型而不定义超类或接口?

在Java中,定义类型的两种机制是接口和类(特别是抽象类)。因为Java只允许一个类扩展另一个类,所以为此目的使用抽象类不会很好。然而,类可以实现任意数量的接口,并且空接口仍然定义类型。如果不了解更多关于用例的信息,就无法判断是否真的需要定义一个类型。

如果你的意图是让你的代码向某种外部框架发出信号,表明应该进行某种特殊的处理,那么该语言必须提供的两种机制是:

  • 标记接口
  • 注释

这两种方法各有利弊。标记接口的优点是,它们实际上定义了一个类型,并且可以编写API来将参数限制为该类型。注释允许在使用地点指定元数据或配置信息。JavaEE框架在客户端代码中广泛使用注释。Java EE中的这些注释可以而且通常提供自定义的配置元数据。

乔舒亚·布洛赫(Joshua Bloch)在《高效Java》第二版中简要介绍了标记接口与注释的优点。

考虑使用如下接口:

interface I {
default String toStr() {   
//implement 
}
//OR : String toStr();
}
class A implements I{} 
class B implements I{}

使用它:

I i;
if (x) {
i = FactoryA.generate(); //construct A
} else {
i = FactoryB.generate(); //construct B
}
i.toStr();

最新更新