双嵌套Java泛型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了双嵌套Java泛型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3221字,纯文字阅读大概需要5分钟。
内容图文
![双嵌套Java泛型](/upload/InfoBanner/zyjiaocheng/677/4f6ca5c829bf45ffa46fc49dbada284b.jpg)
我今天早上问similar question,以为我已经回答了,实际上实施了建议的解决方案,但没有完成我需要的工作.所以这是我的全部问题:
我有以下课程:
// 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”.获取一些数据,选择类型处理器,处理数据,并获取所需的所有元数据.
问题是我的ObjectProcessor< ProcessingMetadata< PROCESSABLE_OBJECT>不合法在类定义的ProcessingMetadata部分上,它为我提供了以下编译器错误:
Syntax error on token(s), misplaced construct(s)
我整个上午都在玩这个类(及其具体的子类),似乎无法正确设置泛型来提供所需的API.我愿意要求PROCESSABLE_OBJECTs实际上是一个接口,例如Processable,并让Apple,Chair等实现它.但是并没有告知客户要处理的内容,因此,我尽可能不要强迫他们让其POJO实现Processabl接口.
那么,我想要的API是否可能?如果是这样,怎么办?如果没有,那为什么呢,我能得到的最接近的是什么?提前致谢!
解决方法:
类型参数列表中的每个项目都必须是类型参数.在ObjectProcessor的类声明中,ProcessingMetadata< PROCESSABLE_OBJECT>不是通用类型参数.
您可以将PROCESSABLE_OBJECT指定为参数化类型,然后将扩展ProcessingMetaData的类型指定为另一个参数化类型.
public abstract class ObjectProcessor<
PROCESSING_METADATA extends ProcessingMetadata<PROCESSABLE_OBJECT>,
PROCESSABLE_OBJECT >
{ ... }
编辑:
您的子类也是参数化类型.您需要在类本身上声明这些类型参数.然后,您可以使用它们来参数化超类.
public class SimpleObjectProcessor<
PROCESSING_METADATA extends ProcessingMetadata<PROCESSABLE_OBJECT>,
PROCESSABLE_OBJECT >
extends ObjectProcessor< PROCESSING_METADATA,PROCESSABLE_OBJECT >
{ ... }
内容总结
以上是互联网集市为您收集整理的双嵌套Java泛型全部内容,希望文章能够帮你解决双嵌套Java泛型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。