摘要泛型class 解释

Abstract generic class explanation

我正在审查一些代码并试图理解下面代码的逻辑,但是下面的示例对我来说太多了:

public abstract class NewPage1<T extends NewPage1> extends SuperPage<T> implements Interface1<T>, Interface2<T>{    
    ...
}

你能给我解释一下刚才发生了什么吗?也许这段代码的一些用例?为什么这个泛型 class 是 T 的一种类型,它扩展了自己,然后又扩展了一些其他泛型 class... 我只是找不到任何 logical/practical 的解释这个。我将不胜感激。

在没有任何上下文的情况下很难说,但这似乎是您尝试使用流畅的操作编写层次结构时使用的一种模式(return 同一对象以便链接调用的方法)。

让我们考虑以下示例:

  abstract class Animal {
     Animal eat() { /* ... */ return this; }
     Animal poo() { /* ... */ return this; }
  }
  abstract class FootedAnimal extends Animal {
     FootedAnimal walk()  { /*...*/ return this; }
  }
  class Dog extends FootedAnimal {
      Dog bark() { /* ... */ return this; }   
  }

有了这个 class,您可以链接方法:

   new Dog()
   .bark()  // returns Dog
   .walk()  // returns FootedAnimal
   .eat()   // returns Animal
   .poo()   // returns Animal
   .eat();  // returns Animal

但是,由于 Animal 中方法的 returning 类型,您不能这样做:

   new Dog()
   .eat()    // returns Animal
   .poo()    // returns Animal
   .bark();  // <- bark() does not exist in Animal !!! 

这可以通过使抽象 class 通用来解决:

  abstract class Animal<S extends Animal<S>> {
     S eat() { /* ... */ return (S)this; }
     S poo() { /* ... */ return (S)this; }
  }
  abstract class FootedAnimal<S extends FootedAnimal<S>> extends Animal<S> {
     S walk() { /* ... */ return (S)this; }
  }
  class Dog extends FootedAnimal<Dog> {
      Dog bark() { /* ... */ return this; }   
  }

现在的方法AnimalFootedAnimalreturn的类型S,即Dog为classDog,这样您就可以自由地链接层次结构的任何级别的方法。

   new Dog()
   .eat()    // returns S=Dog
   .poo()    // returns S=Dog
   .bark()   // returns Dog
   .walk()   // returns S=Dog
   .eat();   // returns S=Dog