摘要泛型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; }
}
现在的方法Animal
和FootedAnimal
return的类型S
,即Dog
为classDog
,这样您就可以自由地链接层次结构的任何级别的方法。
new Dog()
.eat() // returns S=Dog
.poo() // returns S=Dog
.bark() // returns Dog
.walk() // returns S=Dog
.eat(); // returns S=Dog
我正在审查一些代码并试图理解下面代码的逻辑,但是下面的示例对我来说太多了:
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; }
}
现在的方法Animal
和FootedAnimal
return的类型S
,即Dog
为classDog
,这样您就可以自由地链接层次结构的任何级别的方法。
new Dog()
.eat() // returns S=Dog
.poo() // returns S=Dog
.bark() // returns Dog
.walk() // returns S=Dog
.eat(); // returns S=Dog