代码之家  ›  专栏  ›  技术社区  ›  Erwin Smout

Java泛型强制抽象方法的返回类型

  •  11
  • Erwin Smout  · 技术社区  · 16 年前

    我有以下情况:

    abstract class X { abstract X someMethod (...) {...} }.
    

    class X1 extends X { X1 someMethod (...) {...} }.
    class X1 extends X { X someMethod (...) {...} }.  //want this to be flagged as an error
    class X2 extends X { X1 someMethod (...) {...} }.  //want this to be flagged as an error too
    

    使用Java泛型可以实现这一点吗?

    可以。我只问了是/否问题,得到了“是”。我的错。我真正感兴趣的是“我如何写声明”。

    5 回复  |  直到 16 年前
        1
  •  19
  •   Björn    16 年前

    abstract class X<T> {
        public abstract T yourMethod();
    }
    class X1 extends X<X1> {
        public X1 yourMethod() {
            return this;
        }
    }
    class X2 extends X<X2> {
        public X2 yourMethod() {
            return this;
        }
    }
    
        2
  •  4
  •   meriton    16 年前
    abstract class X<I extends X<I>> {
        protected X(Class<I> implClazz) {
            if (!getClass().equals(implClazz)) {
                throw new IllegalArgumentException();
            }
        }
    
        abstract I someMethod();
    }
    

    理由:您不能在类型边界中引用动态类型,因此在构造函数中需要进行间接检查。

        3
  •  2
  •   rjrjr    16 年前

    这里有一种方法,可以让您返回以下参数类型 this :

    AbstractFoo<T extends AbstractFoo<T>> {
      /** Subclasses must implement to return {@code this}. */
      protected abstract T getThis();
    
      /**  Does something interesting and returns this Foo */
      public T inheritedThing {
        /* blah di blah */
        return getThis();
      }
    } 
    
        4
  •  1
  •   uckelman    16 年前
        5
  •  0
  •   Robert J. Walker    16 年前

    这应该工作得很好:

    class X<T> {
      abstract T someMethod(...);
    }
    
    class X1<T1> extends X
      T1 someMethod(...) {
        ...
      }
    }