gpt4 book ai didi

java - SomeClass 什么时候合适/有用
转载 作者:行者123 更新时间:2023-11-29 04:54:04 30 4
gpt4 key购买 nike

我最近在一个我要重构并拥有的项目中遇到了以下代码行:

SomeClass<Object> someClass = new SomeClass<Object>();

我这辈子都想不通为什么有人会以这种方式使用泛型。我想出的唯一原因是 SomeClass 在另一个场景中使用泛型效果很好,因此必须在这里使用一些东西。由于缺乏更好的选择,Object 被使用。

我确实尝试了谷歌搜索,但由于谷歌丢弃了 中的 <>,我得到了标准结果。

============================================= ============================

SomeClass 被广泛地子类化,并且是一个非常庞大和复杂的项目的一部分。使用泛型将提供类型安全和更短代码(无需转换)的常见好处。

鉴于代码的复杂性,我不能确定为什么要这样做,以及它是否真的提供了好处。但是,我想我会问专家,以防万一有一些不为人知的模糊但有效的理由这样做。

或者,这可能是一种防御措施,可以防止像我这样相对缺乏经验的程序员弄乱代码。触摸一个尖括号并观看源代码填充红色...

它确实让我温习了 Java 中泛型的知识。

============================================= =========================

进一步说明,SomeClass 是一种通用容器对象。它以各种方式使用,例如:

class SomeSubClass<SomeClass> extends SomeClass<T> 
class SomeSubClass<? extends SomeSubClass> extends SomeClass<T>

我将第二个示例理解为一种重用通用容器并将其限制为 SomeSubClass 及其子实例的方法。这完全有可能是泛型的滥用、出色的编码或两者兼而有之。

但是,由于我仍在探索这个项目的黑暗角落,我想我应该从一个困扰我并且似乎对其他人感兴趣的问题开始。

============================================= =========================

最终编辑: 代码的原始作者从要子类化的通用数据容器开始,并包含其他对象。如果您是一位出色的程序员,对代码有很好的理解并且能够将其全部包含在您的短期内存中,那么这很有效。唉,以上我都不是。

除了将它用于 10 多个子类之外,他还需要将它用于其他目的,并简单地将上述与 Object.在这种情况下,不需要转换让他从函数返回 SomeClass,让他自己和编译器成为仅有的两个真正了解该类的人。

我很想称这是对 OOD 和泛型的滥用,但我不愿意这样做,因为这个项目的大部分内容仍然被这只疯狂的猫的 Gradle 所纠缠和掩盖。据我所知,这样做有一些非常好的理由。

============================================= =========================

发布最终编辑(是的,我知道)

这原来是由于一个案例 curiously recurring generic pattern .

最佳答案

我能看到的最好的理由是它清楚地表明不是代码早于泛型,而是 SomeClass 的这个实例真的用 Object 参数化了.某种内部代码文档。

让我们使用List例如:List<Object>说“这是一个我可以放入任何东西的列表”,而(如你所知)List<Foo>说“这是一个列表,我只会将 Foo 实例(和子类型)放入其中。”但只是使用 List可能意味着 或者“这是一个我可以放入任何东西的列表”或者“这是一个 List 在代码中早于泛型,但我们只放入 X。”所以通过使用类型参数 <Object> ,作者强调,确实是列表中可能包含任何内容,而不仅仅是它是旧代码。

你是对的,除了 SomeClass someClass = new SomeClass(); 之外它没有提供任何东西在是否需要转换等方面。这就是为什么我将其称为代码文档。

关于java - SomeClass<Object> 什么时候合适/有用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34392600/

30 4 0