这有点难以解释,但我到处寻找,我找不到任何好的答案。
我还看到了 Stack Overflow 问题如何引用接口在 Java 中实现的类类型?以及如何返回与使用 Java 6 传入的类相同类型的对象的实例?,但他们无法回答我的问题。当我应用继承时有一个例外。
有一个例子,为了更容易理解:
假设我有一些名为 SelfMaker 的界面:
public interface SelfMaker <SELF>{
public SELF getSelf();
}
A有一条狗,它可以和另一条狗一起生育。所以狗是“SelfMaker”,像这样:
public class Dog implements SelfMaker<Dog> {
String color;
public String toString() {
return "some " + color + " dog";
}
public Dog procreate(Dog anotherDog) {
Dog son = getSelf();
son.color = color;
return son;
}
@Override
public Dog getSelf() {
return new Dog();
}
}
但是后来,我有一只家养狗,它是一只狗,但它有一个可爱的家庭给他取名。像这样:
public class DomesticDog extends Dog {
private String name;
public String toString() {
return super.toString() + " named " + name;
}
}
现在,我有一些类可以处理一些“SelfMaker”的事情,我们称这个类为“Couple”。像这样:
public class Couple<T extends SelfMaker<T>> {
private T first;
private T second;
public String toString() {
return first.toString() + " and " + second.toString();
}
}
例外:
当我想创建几个DomesticDog
s 时出现异常。像这样:
public class CoupleOfDomesticDogs extends Couple<DomesticDog>{
public DomesticDog procreate(){
DomesticDog son = first.procreate(second);
return son;
}
}
<DomesticDog>
这将在抱怨时引发异常:Bound mismatch: The type DomesticDog is not a valid substitute for the bounded parameter <T extends SelfMaker<T>> of the type Couple<T>
我已经尝试将广义变量从 Couple 类更改为:Couple<T extends SelfMaker<?>>
但“儿子”不会是 DomesticDog(我希望“儿子”成为 DomesticDog)。如果我添加一些演员表,那么它会编译,但它会不太清晰。
所以......这是一个问题:有没有办法在没有铸造和概括的情况下实现这一目标?