Я пытаюсь сделать что-то, что я обычно не делал, это немного странно, но я хотел бы заставить его работать. По сути, у меня есть фабрика, которая должна создавать объекты, вызывая конструктор с различными типами данных (A и B принимают разные типы в коде ниже). Кажется, я получил свое самоустановленное движение по маршруту дженериков (мне нужно, чтобы код был как можно более сложным для времени компиляции). Я не возражаю против написания кода по-другому (я хотел бы оставить идею фабрики, если это возможно, и я не хочу добавлять в приведениях, поэтому параметр «данные» не может быть «объектом»).generics call constructor
Любые мысли о том, как исправить код с помощью дженериков или альтернативный способ его выполнения, который соответствует моим требованиям?
(Технически это домашнее задание, но я инструктор пытается что-то новое ... так что это на самом деле не домашнее задание :-)
public class Main2
{
public static void main(String[] args)
{
X<?> x;
x = XFactory.makeX(0, "Hello");
x.foo();
x = XFactory.makeX(1, Integer.valueOf(42));
x.foo();
}
}
class XFactory
{
public static <T> X<T> makeX(final int i,
final T data)
{
final X<T> x;
if(i == 0)
{
// compiler error: cannot find symbol constructor A(T)
x = new A(data);
}
else
{
// compiler error: cannot find symbol constructor B(T)
x = new B(data);
}
return (x);
}
}
interface X<T>
{
void foo();
}
class A
implements X<String>
{
A(final String s)
{
}
public void foo()
{
System.out.println("A.foo");
}
}
class B
implements X<Integer>
{
B(final Integer i)
{
}
public void foo()
{
System.out.println("B.foo");
}
}
Я на самом деле не игрушка, но да, это не суперкритично. Я склоняюсь к этому способу делать это или изменяю тип аргумента, чтобы просто быть строкой. На самом деле строка исходит из argv и представляет либо имя файла, либо строку соединения JDBC. – TofuBeer
Хорошо, я просто собирался «Как бы это реализовать», и это в основном то, что вышло. – wds