私は今朝、同様の質問をしましたが、答えられたと思っていましたが、提案されたソリューションを実際に実装しましたが、必要なことを実行できませんでした。だからここに私の完全な問題があります:
私は次のクラスを持っています:
// 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_OBJECT
実装します。しかし、クライアントが何を処理したいかはわかりません。そのため、可能であれば、POJO にインターフェースを実装させることを強制したくありません。Processable
Apple
Chair
Processabl
それで、私の望むAPIは可能ですか?もしそうなら、どのように?そうでない場合、その理由と、それに最も近いものは何ですか? 前もって感謝します!