我正在创建这样的东西,并对java中泛型的使用感到震惊。
创意:制作人生成类型为T的内容,消费者包含命令对象,命令对象包含不同的调解器 。调解器包含主题类型的对象,并更新类型为T
的值注意:我这样做是为了理解泛型如何在泛型类型的继承和泛型类接口和具体类中的类型参数定义的组合方面工作,所以请不要这样做。打扰设计的基本原理。
接口定义:
成分:
IObserver
包含T型和IObserver对象的ISubject。
IMediator保存ISubject类型的对象并输入T
ICommand保存IMediator类型的对象并输入T
IProducerConsumer保存T类和ICommand类型的对象。
对应的接口有一些具体的对象。 我定义了这样的接口:
public interface IObserver<T>
public interface ISubject<T,O extends IObserver<T>>
直到现在。但现在问题就开始了。
public interface IMediator<T,S extends ISubject<T,O>, O extends IObserver<T>>
编译器迫使我这样做。我的意思是O extends IObserver<T>
如上所述。所以,我猜测我不能像下面那样定义
public interface IMediator<T,S extends ISubject<T,O extends IObserver<T>> >
我总结说:内部类型参数定义不能像上面那样扩展。
所以,终于开心了
公共接口IMediator<T,S extends ISubject<T,O>, O extends IObserver<T>>
现在在ICommand开始乱七八糟了
public interface ICommand <T,M extends IMediator<T, ?, ?>>
,
我现在很震惊编译器不接受我的许多可能性,即使我上面做了什么推论。我的意思是
public interface ICommand <T,M extends IMediator<T, S, o>, S extends ISubject<T, IObserver<T>>,O extends IObserver<T>>
无效。 我不想使用外卡我想告诉编译器一些更具体的内容。
我的问题是:
我的推理是否正确,如ICommand定义。
如何解释上述案例研究。
假设我想插入T并且必须能够获得和放置,最好的定义是什么。
接口和实现类中类型参数定义的规则和关系是什么。
请解释一下?
答案 0 :(得分:1)
Mediator
时写了一个小'o'。 (我想这只是打字错误。)IObserver<T>
代替O
传递给ISubject
,这肯定会导致参数绑定不匹配。正确版本:
interface ICommand<T, M extends IMediator<T, S, O>, S extends ISubject<T, O>, O extends IObserver<T>>
接口声明:
interface IObserver<T>
interface ISubject<T, O extends IObserver<T>>
interface IMediator<T, O extends IObserver<T>, S extends ISubject<T,O>>
interface ICommand<T, O extends IObserver<T>, S extends ISubject<T, O>,
M extends IMediator<T, O, S>>
interface IProducerConsumer<T, O extends IObserver<T>, S extends ISubject<T, O>,
M extends IMediator<T, O, S>, C extends ICommand<T, O, S, M>>
可能有足够的方式:
interface IObserver<T>
interface ISubject<T>
interface IMediator<T>
interface ICommand<T>
interface IProducerConsumer<T>
两个简单的案例:
// General way
private class ProductObserver implements IObserver<Product> { }
private ProductObserver productObserver;
// Aspect oriented way
private class LoggerObserver<T> implements IObserver<T> { }
private LoggerObserver<Product> loggerObserver;
希望这有帮助。
祝你好运。