泛型与接口

2022-09-04 03:47:39

我从Java 1.4(以前的公司)过渡到Java 1.6(新公司)。我所观察到的是,在1.4的情况下,大多数专有框架都是使用接口和模板模式定义的,而在1.6的情况下,大多数框架都是围绕泛型定义的。

虽然我仍然试图掌握泛型,但我的问题是 - 这是一种正确的设计方法吗?接口使您的设计更加灵活/解耦。而泛型,实现类型安全并强制您传递特定类型的类。对解耦代码没有真正帮助。这是正确的吗?

举个例子——

public MyWizard extends SignupWizard<SignupSection, SignupObject, SignupListener, SignupView>{
}

相反,如果它是..,设计会更灵活。

public interface Wizardable{
  public SignableSection getSection();
  public SignableObject getSignableObject();
...
}

public MyWizard implements Wizardable{
....
}

答案 1

我不会说任何东西都是泛型与接口,每个都有不同的需求和用途。以原始帖子中提到的方式使用通用参数有多种用途。它允许开发人员定义构成类的字段对象类型的基类。使用此功能,开发人员可以接受类对象作为参数,他们可以使用反射来创建实际对象并设置字段,或者只是接受首先要设置的整个对象。与需要类对象而不是执行类对象之类的问题称为类型擦除new T()

使用泛型的另一个好处是,在使用超类中的字段或方法时,您不需要一直进行类型转换 - 您个人知道它们的类型,但Java没有将该类型信息存储在任何地方。另一个好处是,所有 getter/setter 方法都可以使用泛型参数,并向其他对象公开一个更合理的前端,这些对象依赖于您在上述对象中设置专用字段的事实。

使用接口执行与泛型相同的操作的问题在于,在返回它们之前(或检查传入类型,然后将字段设置为对象),您需要其他方法来访问专用类型并强制转换它们。它使设计更加复杂,并且对解耦根本没有帮助。

正如我在注释中提到的,任何子类都会设置这些类型参数,并且不会向用户公开任何内容。因此,您可以拥有类似的东西,并且一切都保持完全有效,无需任何转换即可访问类中的专用方法。现在这很酷:)class MegaSignupWizard extends SignupWizard<MegaSignupSection, MegaSignupObject, MegaSignupListener, MegaSignupView>MegaSignupWizard


答案 2

泛型允许您在常规类型上实现方法,而接口仅定义签名。也许它有时被滥用来表现得像Scala一样,但大多数情况下它们有两个不同的目的。如果一切都是一个接口,那么将会有很多重复的代码或对某个帮助程序类的委派。trait