파일에서 줄을 읽을 때 Guava의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
위에 표시된대로 선언 하고 일반 컬렉션을 인수로 사용하는 보호 된 생성자를 추가 할 수 있습니다 .
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<>());
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다