У меня есть ситуации, как это:Java Дженерик -> Функция возвращает тип
У меня есть класс, который выглядит следующим образом:
public class TestClass<T> {
// class body here...
}
И у меня есть метод, который выглядит следующим образом:
public class AnotherTestClass<K> {
private TestClass<K> testClass;
public AnotherTestClass(TestClass<K> testClass) {
this.testClass = testClass;
}
public K testMethod() {
//call methods on param object and pass a value of the same type as testClass.
K returnVal = this.testClass.doSomething();
return returnVal;
}
}
Теперь у меня есть фабричный метод, который возвращает объект типа TestClass<?>
public TestClass<?> sampleFactory(int i) {
if(i==1)
return new TestClass<Integer>();
if(i==2)
return new TestClass<Double>();
if(i==3)
return new TestClass<String>();
}
Но я не могу использовать этот метод для передачи параметра в свой testMethod
. Какое решение для этого?
В настоящее время я пишу if else
цепных блоков, чтобы получить правильный экземпляр. Я знаю, что это неверно, поскольку нецелесообразно писать блоки if else
, когда есть несколько параметров, таких как выше.
Пожалуйста, предложите элегантный способ для этого.
EDIT: Пример использования:
package my;
import java.util.ArrayList;
import java.util.List;
public class GenericsSpike {
public static void main(String[] args) {
TestClass1<?> tc1 = new TestClass1<Integer>(123);
TestClass2<?> tc2 = new TestClass2<Integer>(123);
AnotherTestClass<?> atc = new AnotherTestClass<Integer>(tc1, tc2);
atc.testMethod();
}
}
class TestClass1<T> {
private T value;
TestClass1(T val) {
value = val;
}
// class body here...
public T getValue() {
return value;
}
}
class TestClass2<T> {
private T value;
TestClass2(T val) {
value = val;
}
// class body here...
public T getValue() {
return value;
}
}
class AnotherTestClass<K> {
public TestClass1<K> testClass1, testClass2;
public AnotherTestClass(TestClass1<K> testClass, TestClass2<K> testClass2) {
this.testClass1 = testClass;
}
public K testMethod() {
//Any logic can come here.
System.out.println(testClass1.getValue());
System.out.println(testClass2.getValue());
return testClass1.getValue();
}
}
В этом случае, если tc1
и tc2
приходят с завода, который создает эти объекты, я хочу знать, Что порядочный способ создания экземпляра AnotherClass
Какой у вас должен быть метод testMethod? и можете ли вы показать свой заводской метод? –
Чтобы уточнить, можете ли вы добавить выдержку 'if/else', которую вы хотите заменить –
Спасибо за ваш ответ. Я отредактировал этот вопрос. Пожалуйста, дайте мне знать, если мне нужно добавить еще кое-что. – LPD