java - 通用方法。仅限子类
问题描述
我有以下类层次结构:
Base
\
+-- A
|
+-- B
|
+-- C
我想设计一个可以接受从Base派生的任何类的单个泛型方法,例如A、B、C ... Z但不是Base本身。
这可能吗?怎么做?
PS主要思想是做这样的事情:
public void<TYPE> myMethod(TYPE arg) {}
其中: TYPE 是从Base派生的任何类型,不包括它,并且当使用 type A对方法进行参数化(这是正确的词吗?)时,不允许使用除A之外的其他参数类型。同样应该适用A .. Z。
我想出了一些想法来做到这一点。
- 我已将Base包设为私有
我已将设计的 Helper类放入同一个包中,并使其非常简单:
public class Helper<T extends Base> { public void myMethod(T item) {} }
- 我已将所有调用代码移至另一个包。
通过这种方式,我能够禁止以下事情:
Helper<Base> helper = new Helper<>();
helper.myMethod(new A());
helper.myMethod(new B());
它就像
Helper<A> helperA = new Helper<>();
Helper<B> helperB = new Helper<>();
Helper<Base> helperBase = new Helper<>(); // error
helperA.myMethod(new A());
helperA.myMethod(new B()); // error
helperB.myMethod(new B());
正如预期的那样。
有没有更好的方法来做到这一点?
解决方案
对的,这是可能的。您可以声明Base
为abstract
which 将使其不可实例化。
推荐阅读
- algorithm - 如何实现 Gale-Shapley 算法的 O(n^2) 复杂度?
- c# - 在 .NET 4.5 可执行文件中运行 .NET 2.0 目标 DLL
- git - 如何更新拉取请求?
- node.js - async.js 映射函数选择错误的重载?
- scala - sbt 在 net.contentobjects.jnotify.macosx.JNotifyAdapterMacOSX 运行 ExceptionInInitializerError。
(来源不明) - jenkins - 我如何在 jenkinsfile 中添加条件步骤
- python - 选择以 [1]、[2] 等开头并在到达下一个数字 [x] 到 [x+1] 时结束的段落的最佳方法是什么
- python - 无法读取基于正则表达式的文件 spark
- xcode - Xcode 构建错误:pngcrush 捕获 libpng 错误
- ios - 使用 Firebase 通知在 XCODE 下编译 IOS 应用程序