Это, вероятно, задавали миллионы раз раньше, но у меня возникают проблемы с записью конструктора копий в абстрактном классе с параметром ограниченного типа. У меня есть код, который выглядит так:
public abstract class Superclass<T> {
Set<? extends Variable<T>> vars;
public abstract Superclass<? extends T> copy();
class Variable<T> {
T value;
}
}
class Foo extends Superclass<Integer> {
public Foo copy() {
Foo _newFoo = Foo();
Set<FooVariable> _newVars = new HashSet<FooVariable>();
_newVars.addAll(this.vars);
_newFoo.vars = _newVars;
}
class FooVariable extends Variable<Integer> { /* ... */ }
}
class Bar extends Superclass<String> {
public Bar copy() {
Bar _newBar = Bar();
Set<BarVariable> _newVars = new HashSet<BarVariable>();
_newVars.addAll(this.vars);
_newBar.vars = _newVars;
}
class BarVariable extends Variable<String> { /* ... */ }
}
Так как метод copy
для Foo
и Bar
является тем же, за исключением типов переменных, я хотел бы иметь возможность переместить этот код в конкретный метод в суперклассе. Но я не могу понять (а), как иметь конкретный метод public Superclass<? extends T> copy
, возвращать экземпляр Foo
, если он вызван в экземпляре Foo
и Bar
, если вызывается в Bar
и (b) vars
установить с FooVariable
или BarVariable
, если это необходимо.
Может ли кто-нибудь помочь и рассказать мне, что мне не хватает? Спасибо.