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

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

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

    我有以下情况:

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

    现在我想约束X的任何实现,使其“someMethod”方法返回特定的实现类型,而不仅仅是X:

    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 回复  |  直到 15 年前
        1
  •  19
  •   Björn    15 年前

    这也行得通;

    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    15 年前
    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    14 年前

    这里有一种方法可以让您为 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    15 年前
        5
  •  0
  •   Robert J. Walker    15 年前

    这应该很好:

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