gpt4 book ai didi

java - 扩展集合泛型类的泛型类

转载 作者:行者123 更新时间:2023-12-01 13:13:27 25 4
gpt4 key购买 nike

我正在使用Guava's LineProcessor从文件中读取行时的界面。我创建了名为 Line Loader 的类,它将存储读取的行。我希望它对于应存储的集合行的选择是通用的,所以我写了这样的东西:

public abstract class LineLoader<T> implements LineProcessor<Collection<T>> {        
private final Collection<T> result;

public LineLoader() {
this.result = init();
}

protected boolean add(final T line) {
return result.add(line);
}

@Override
public boolean processLine(final String line) throws Exception {
final T data = parser.parseLine(line);

if (data == null) {
return false;
}

return add(data);
}

@Override
public Collection<T> getResult() {
return result;
}

protected abstract Collection<T> init();
}

使用 init() 方法,我强制子类选择集合类型,例如:

public abstract class LinkedLineLoader<T> extends LineLoader<T> {
@Override
protected Collection<T> init() {
return new LinkedList<T>();
}
}

我计划这样做:

public class LineLoader<T> implements LineProcessor<C<T> extends Collection<T>> {        
private final C<T> result;

public LineLoader() {
result = new C<T>();
}

protected boolean add(final T line) {
return result.add(line);
}

@Override
public boolean processLine(final String line) throws Exception {
final T data = parser.parseLine(line);

if (data == null) {
return false;
}

return add(data);
}

@Override
public C<T> getResult() {
return result;
}
}

以便后面的子类(如果需要)可以这样做:

public class LinkedLineLoader<T> extends LineLoader<LinkedList<T>> {

}

但这不可能。这个问题有一个干净的解决方案吗?

最佳答案

在 Java 中,不可能从泛型类型参数创建实例,因为泛型在运行时会被删除。此外,泛型类型参数本身不能声明其他类型参数,如 C<T> 。因此,您发布的代码完全非法,无法编译:

private final C<T> result; // illegal
result = new C<T>(); // illegal

除此之外,您对类型参数的声明本身也存在一些缺陷。以下代码不是合法的 Java 代码:

public class LineLoader<T> implements LineProcessor<C<T> extends Collection<T>>

它实际上应该看起来像像这样:

public class LineLoader<T, C extends Collection<T>> implements LineProcessor<C>

作为问题的解决方案,您可以声明您的 LineLoader如上所示,并添加一个 protected 构造函数,它将通用集合作为参数:

public abstract class LineLoader<T, C extends Collection<T>> implements LineProcessor<C> {        
private final C result;

protected LineLoader(C collection) {
result = collection;
}

protected boolean add(final T line) {
return result.add(line);
}

@Override
public boolean processLine(final String line) throws IOException {
final T data = parser.parseLine(line);

if (data == null) {
return false;
}

return add(data);
}

@Override
public C getResult() {
return result;
}
}

然后你就可以实现你的 LinkedLineLoader像这样:

class LinkedLineLoader<T> extends LineLoader<T, LinkedList<T>> {
public LinkedLineLoader() {
super(new LinkedList<>());
}
}

关于java - 扩展集合泛型类的泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22652546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com