很抱歉,我无法更深入或更抽象地描述我的问题。我觉得解释我的问题的最好方法是通过这个非常具体的例子。
我想定义一个函数“readCollection”,它会解析一个字符串,并根据我调用函数的方式给我一个特定类型的特定集合。
例如,我想这样使用它:
ArrayList<Foo> fb = readCollection("Foo1\n Foo2\n Foo3\n");
或者
LinkedList<Bar> fb = readCollection("Bar1\n Bar2\n Bar3\n");
当然,我已经为每个类定义了一个接口,该接口具有用于读取一个实例(“Bar..”)的“读取”方法。
我陷入了两个问题之间:
- 自然函数 readCollection 应该是静态函数,但接口不能有静态方法。
- 方法 readCollection 应该返回 Foo 或 Bar 等类型的新对象,但我“无法实例化该类型”,这通常在我定义 readCollection 的类中定义。
- 假设该方法不是静态定义的,我不能在不引用该类型的特定对象的情况下调用它,由于前一点我不能这样做。
如何编写我的方法而不为每个 Foo 和 Bar 等复制它?
我似乎自己找到了解决方案,但它非常丑陋和讨厌。
我现在有
public interface Readable<T> {
public T read(String str); }
和
public class ReadCollection<T extends Readable<T>> {
public Collection<T> read(File file, Collection<T> ts, T t) {
...
ts.add(t.read(strLine));
...
return ts;
} }
和
public class Bars extends ReadCollection<Bar>{
...
public static void main(String[] args) {
new Bars().read(new File("fake/path"), new ArrayList<Bar>(), new Bar()); }
在这里,我发送了一个 ArrayList 的新实例,以将结果返回给 Bar,以便引用方法“读取”。我看不出我怎么能避免这种情况。
请告诉我有更好的方法。在某个地方,我希望我事后感到非常愚蠢。