首页 > 解决方案 > 通用方法。仅限子类

问题描述

我有以下类层次结构:

Base
    \
     +-- A
     |
     +-- B
     |
     +-- C

我想设计一个可以接受从Base派生的任何类的单个泛型方法,例如A、B、C ... Z但不是Base本身。

这可能吗?怎么做?

PS主要思想是做这样的事情:

public void<TYPE> myMethod(TYPE arg) {}

其中: TYPE 是从Base派生的任何类型,不包括它,并且当使用 type A对方法进行参数化(这是正确的词吗?)时,不允许使用除A之外的其他参数类型。同样应该适用A .. Z


我想出了一些想法来做到这一点。

  1. 我已将Base包设为私有
  2. 我已将设计的 Helper类放入同一个包中,并使其非常简单:

    public class Helper<T extends Base> {
        public void myMethod(T item) {}
    }   
    
  3. 我已将所有调用代码移至另一个包。

通过这种方式,我能够禁止以下事情:

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());

正如预期的那样。

有没有更好的方法来做到这一点?

标签: javagenerics

解决方案


对的,这是可能的。您可以声明Baseabstractwhich 将使其不可实例化。


推荐阅读