在Java中有什么方法可以返回多态吗?

在Typescript中,有一个多态返回类型this的概念.
https://www.typescriptlang.org/docs/handbook/advanced-types.html#polymorphic-this-types
例:

export abstract class Animal {
    private name: string;

    public setName(name: string): this {
        this.name = name;
        return this;
    }
}

export class Dog extends Animal {
    private breed: string;

    public setBreed(breed: string): this {
        this.breed = breed;
        return this;
    }
}

export class FluffyDog extends Dog {
    private fluffiness: number;
    public setFluffiness(fluffiness: number): this {
        this.fluffiness = fluffiness;
        return this;
    }
}

export class Main {
    constructor() {
        const dog: FluffyDog = new FluffyDog()
            .setName('Fluffy')
            .setFluffiness(10)
            .setBreed('Lab');
    }
}

Java有什么等效功能吗?
我想出的最好的是:

public abstract class Animal<T extends Animal<T>> {
    private String name;
    public T setName(String name) {
        this.name = name;
        return (T)this;
    }
}

class Dog extends Animal<Dog> {
    private String breed;
    public Dog setBreed(String breed) {
        this.breed = breed;
        return this;
    }
}


class Main {
    static {
        Dog dog =  new Dog()
                .setName("Fluffy")
                .setBreed("Lab");
    }
}

或这个:

public abstract class Animal {
    private String name;
    public <T extends Animal> T setName(String name) {
        this.name = name;
        return (T)this;
    }
}

class Dog extends Animal {
    private String breed;
    public <T extends Dog> T setBreed(String breed) {
        this.breed = breed;
        return (T)this;
    }
}

class FluffyDog extends Dog {
    private Long fluffiness;
    public <T extends FluffyDog> T setFluffiness(Long fluffiness) {
        this.fluffiness = fluffiness;
        return (T)this;
    }
}


class Main {
    static {
        FluffyDog dog =  new FluffyDog()
                .<FluffyDog>setName("Fluffy")
                .setFluffiness(10L)
                .setBreed("Lab");
    }
}

一个似乎只能被继承一次.
在某些情况下,第二个要求显式类型参数.
在Java中有什么方法可以返回多态吗?

解决方法:

另外两个选择:

>由于设置方法的顺序无关紧要,因此从功能上讲,请按自下而上的顺序进行调用.如果先分配给变量,则无需强制转换.

final FluffyDog dog = new FluffyDog();
dog.setFluffiness(10)
   .setBreed("Lab")
   .setName("Fluffy");

>重写继承的setter方法以更改返回类型,使用super委托给实际的实现:

class Animal {
    private String name;
    public Animal setName(String name) {
        this.name = name;
        return this;
    }
}
class Dog extends Animal {
    private String breed;
    @Override
    public Dog setName(String name) {
        super.setName(name);
        return this;
    }
    public Dog setBreed(String breed) {
        this.breed = breed;
        return this;
    }
}
class FluffyDog extends Dog {
    private long fluffiness;
    @Override
    public FluffyDog setName(String name) {
        super.setName(name);
        return this;
    }
    @Override
    public FluffyDog setBreed(String breed) {
        super.setBreed(breed);
        return this;
    }
    public FluffyDog setFluffiness(long fluffiness) {
        this.fluffiness = fluffiness;
        return this;
    }
}
class Main {
    public static void main(String[] args) throws Exception {
        final FluffyDog dog = new FluffyDog()
                .setName("Fluffy")
                .setBreed("Lab")
                .setFluffiness(10);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐