В заголовке указано Java, но я думаю, что этот вопрос относится к OOP языкам с аналогичной статической типизацией, таким как Java. Итак, вот так:
Учитывая ситуацию, подобную этой
package com.company;
public class SomeGenericClass<T> {
private T thing;
public T returnThing() {
// this is fine
return thing;
}
public T mergeThisThingWith(T otherThing) {
//??
// This involves using some sort of constructor to create an instance of
// whatever T is, using this, and the otherThing passed in. In this case,
// how do one handle this pattern where a constructor needs to be used polymorphically?
return null;
}
}
Как реализовать метод, который требует наличия своего рода конструктора элемента generi c, в котором он нуждается return.
Даже если тип generi c имеет ограничение, это не поможет. Ограничение делает доступными только методы на границе, но не конструктор. Так, например:
package com.company;
public class SomeGenericClass<T extends AClass> {
private T thing;
public T returnThing() {
// this is fine
return thing;
}
public T mergeThisThingWith(T otherThing) {
//??
// This involves using some sort of constructor to create an instance of
// whatever T is, using this, and the otherThing passed in. In this case,
// how do one handle this pattern where a constructor needs to be used polymorphically?
return null;
}
public T returnUsingMethodOnAClass() {
// this is fine
return this.thing.methodOnAClass();
}
public T returnANewTUsingMethodOnAClass() {
// still can't create a new instance of
// whatever T is, using a constructor
return null
}
}
Аналогичная ситуация также может наблюдаться в случае наследования, поэтому с учетом этого базового класса:
public class SomeGenericClass {
public String returnString() {
return "This is fine";
}
public SomeGenericClass returnChildClass() {
// How do one implement this method such that it
// returns RedThing in case, it is called on an instance of RedThing
// or it returns BlueThing in case, it is called on an instance of BlueThing
return null;
}
}
Как можно реализовать returnChildClass
так, чтобы он возвращает RedThing
в случае, если он вызывается для экземпляра RedThing
или возвращает BlueThing
в случае, если он вызывается для экземпляра BlueThing
В основном, как это можно реализовать так, чтобы возможно следующее:
RedThing redThing = new RedThing();
BlueThing blueThing = new BlueThing();
RedThing someGenericClass = redThing.returnChildClass();
BlueThing someGenericClass = blueThing.returnChildClass();
Кажется, что я ищу шаблон с полиморфными c конструкторами. Это действительная вещь, чтобы ожидать? И если да, то как можно go реализовать такие?