gpt4 book ai didi

java - 接口(interface)和具体类中的类型参数泛型

转载 作者:行者123 更新时间:2023-11-30 11:20:16 24 4
gpt4 key购买 nike

我正在创建类似这样的东西,并对 java 中泛型的使用感到震惊。

思路:Producer生产T类型的东西,consumers包含command对象,command对象持有不同的mediators .调解器持有Subject 类型的对象并更新T 类型的值

注意:我这样做是为了了解泛型在泛型类型的继承和泛型类型接口(interface)和具体类中的类型参数定义的组成方面是如何工作的,所以请不要理会基本原理设计。

接口(interface)定义:

组成:

  1. IObserver

  2. ISubject 持有类型 T 和 IObserver 的对象。

  3. IMediator 持有类型为 ISubject 和类型为 T 的对象

  4. ICommand 持有 IMediator 类型和 T 类型的对象

  5. IProducerConsumer 持有类型为 T 和 ICommand 的对象。

相应的接口(interface)有一些具体的对象。我这样定义接口(interface):

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>> >

我得出结论:内部类型参数定义一定不能像上面那样扩展。所以,终于满意了公共(public)接口(interface)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>>

不工作。我不想使用通配符我想告诉编译器一些更具体的事情。

我的问题是:

  1. 我的推断是否与 ICommand 定义中的一样正确。

  2. 如何解读上述案例研究。

  3. 假设我想插入 T 并且必须能够获取和放置,最好的定义是什么。

  4. 接口(interface)和实现类中类型参数定义的规则和关系是什么。

请解释一下?

最佳答案

具有绑定(bind)参数的泛型(无通配符)

  • 我的推断是否与 ICommand 定义一样正确?

    否。有两个原因
    1. 你在传递给 Mediator 时写了一个小写的“o” . (我想这只是一个打字错误。)
    2. 您通过了 IObserver<T>代替 OISubject这肯定会导致参数绑定(bind)不匹配。

正确版本:

interface ICommand<T, M extends IMediator<T, S, O>, S extends ISubject<T, O>, O extends IObserver<T>>

  • 如何解读上述案例研究?

    1. 首先您需要了解您有一个未知类型 T 和五个接口(interface)。
    2. 因此,您总共有 6 个具体类型,它们必须逐步包含在接口(interface)声明中。 (您明确要求不要理会设计的基本原理。)
    3. 如果您以正确的顺序编写它们,它就会变得更易于管理。

接口(interface)声明:

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>>

  • 假设我要插入 T 并且必须能够获取和放置,最好的定义是什么?

    1. 如果您想要获取和放置 T 类型的对象,您可能需要的是一组接口(interface),它只接受一个参数 T。泛型将强制所有都兼容,因为 T 将在任何地方被相同的类型替换。
    2. 您当前的系统过于死板。在实际场景中,您永远不会有这么多这些接口(interface)的实现(除非您在 java 中重新实现 facebook),因此您会有许多可能的实现组合,并且您希望确保兼容性。
    3. 泛型通过应用良好的限制来强制执行类型安全。但是你不应该仅仅因为你可以设置限制就设置限制。您正在失去代码的灵 active 可读性可维护性
    4. 您应该只在需要时才添加边界。它们不应以任何方式影响设计在接口(interface)之间的契约(Contract)已确定之前。

可能足够的方式:

interface IObserver<T>

interface ISubject<T>

interface IMediator<T>

interface ICommand<T>

interface IProducerConsumer<T>

  • 接口(interface)和实现类中类型参数定义的规则和关系是什么?

    1. 我能想到的接口(interface)中类型参数与实现类之间的唯一关系是实现类必须提供一个类型来替换泛型类型参数。
    2. 在某些情况下,该类型可以再次成为通用类型,在这种情况下,提供具体类型的责任将转交给使用类引用或扩展该类的另一个类的代码。 它甚至可能是递归的!
    3. 规则不是用语言编写的,相反,当您绑定(bind)任何类型参数时您就是在该机制上应用所有规则。因此,只要您提供的类型符合所有规则,就可以开始了。
    4. 更多规则意味着更健壮灵 active /可读性较差。明智的交易也是如此。

两个简单的案例:

// 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;

  • 最后,我建议您阅读(综合)Java Generics FAQ Angelika Langer 如果您有任何进一步的疑问。
  • 如果您继续这样试验,您可能最终会发明一种设计模式。做的时候不要忘记与我们分享 :D

希望这对您有所帮助。
祝你好运。

关于java - 接口(interface)和具体类中的类型参数泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22829533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com