오늘 아침에 similar question에 물어 보았습니다. 제안 된 솔루션을 실제로 구현했는데 필요한 해결책을 찾지 못했다고 생각했습니다. 나는 다음과 같은 수업을이중 중첩 된 Java generics
: 그래서 여기 내 전체 문제의
// Objects to process.
public class Apple {
private Color color;
private int numberOfSeeds;
// ...
}
public class Chair {
private Material madeOutOfMaterial;
private double price;
// ...
}
public class CellPhone {
private Manufacturer make;
private String model;
private boolean isSmartPhone;
// ...
}
// Contains the object that will be processed (an Apple, Chair, CellPhone instance, etc.)
// as well as metadata info about the processing itself (timestamp, a UUID for tracking
// purposes, etc.).
public class ProcessingMetadata<PROCESSABLE_OBJECT> {
private PROCESSABLE_OBJECT result;
private Date processedOnDate;
private String uuid;
// ...
}
// Abstract base class for processing PROCESSABLE_OBJECTs.
public abstract class ObjectProcessor<ProcessingMetadata<PROCESSABLE_OBJECT>> {
private String name;
public abstract ProcessingMetadata<PROCESSABLE_OBJECT> process(Data data);
}
// One concrete processor.
public class SimpleObjectProcessor extends ObjectProcessor<ProcessingMetadata<PROCESSABLE_OBJECT>> {
private Fizz fizz;
@Override
public ProcessingMetadata<PROCESSABLE_OBJECT> process(Data data) {
// Processes data one way, and returns a PROCESSABLE_OBJECT.
}
}
// Another concrete processor.
public class ComplexObjectProcessor extends ObjectProcessor<ProcessingMetadata<PROCESSABLE_OBJECT>> {
private Buzz buzz;
@Override
public ProcessingMetadata<PROCESSABLE_OBJECT> process(Data data) {
// Processes data differently, and returns a PROCESSABLE_OBJECT.
}
}
그래서 최종 코드는 이러한 모든 클래스를 사용하는 것은 다음과 같습니다 것을 :
ObjectProcessor<ProcessingMetadata<Apple>> appleProcessor =
new ComplexObjectProcessor<ProcessingMetadata<Apple>>();
Data data = getData();
ProcessingMetadata<PROCESSABLE_OBJECT> meta = appleProcessor.process(data);
Apple apple = meta.getResult();
Date processedOn = meta.getProcessedOnDate();
String uuid = meta.getUUID();
이는 "API입니다 "나는 개발자에게 노출되기를 원한다. Data
을 잡고 입력 된 프로세서를 선택하고 데이터를 처리 한 다음 필요한 모든 메타 데이터를 가져옵니다.
문제는 내 ObjectProcessor<ProcessingMetadata<PROCESSABLE_OBJECT>>
이 유효하지 않다는 것입니다. 그것은 클래스 정의의 ProcessingMetadata
부분에 나에게 다음과 같은 컴파일러 오류가 있습니다 :
토큰 (들), 잘못된 구조 (들)
나는이 클래스와 연주 한 (및에
구문 오류 구체적인 서브 클래스들)을 제공하고 제네릭을 올바르게 설정하여 원하는 API를 제공하지 못하는 것 같습니다. 나는 실제로 Processable
과 같은 PROCESSABLE_OBJECT
을 필요로하며, Apple
, Chair
등을 구현하고 있습니다. 그러나 클라이언트가 처리하고자하는 것을 알려주지 않으므로 POJO가 가능한 경우 모두 Processabl
인터페이스를 구현하도록 강요하지 않는 것을 선호합니다.
그래서 이 원하는 API를 사용할 수 있습니까? 그렇다면 어떻게? 그렇지 않다면, 왜, 그리고 내가 얻을 수있는 가장 가까운 것이 무엇입니까? 미리 감사드립니다!
시도로이 라인
을 사용 . – Kevin
@Kevin : 도움 안됨 – jlordo
@Kevin : this is Java – newacct