gpt4 book ai didi

Java:特定对象作为 Iterable 中的泛型类型

转载 作者:行者123 更新时间:2023-12-02 18:08:57 25 4
gpt4 key购买 nike

Java 中是否有一种方法内联创建对象,就像在 TypeScript 中使用方括号一样,并在 Iterable 中使用它们?

如果这不可能,哪一种是实现此功能的最佳方法?

示例:

public Iterable<{ "month" : String, "hours" : double }> getHoursGroupByMonth(int userId);

最佳答案

乍一看,TypeScript 可能看起来与 Java 类似,但这是一种错觉。 TypeScriptJavaScript 的超集。这些语言与 Java 有很大不同。

在 Java 中,一切都是围绕类构建的。要在 Java 中创建对象,您总是需要一个(或enum,或记录,它们基​​本上是特殊类型的类),唯一的异常(exception)是数组(它们内置于语言中,并且您不引用任何类来实例化它们,但数组仍然是Object类型的对象和实例)。您不能在 Java 中内联创建自定义对象。

相反,在 TypeScript 和 JavaScript 中,一切都是围绕对象构建的。您可以内联创建对象,在 TypeScript 中您可以定义内联类型。继承基于原型(prototype)链(每个对象都有一个私有(private)属性,该属性保存到另一个对象的链接)。所有这些机制对于 Java 来说都是陌生的。是的,存在于 TypeScript 和最新版本的 JavaScript 中,但它们只是构造函数的语法糖。

咱们进入正题吧。您需要具有以下形状的类型:

{ "month" : String, "hours" : double }

顺便说一句:有一个枚举 Month java.time 包中,优先使用 枚举而不是字符串(因为enum 向您证明了普通字符串无法提供的行为,并防止您犯错)。

Java 是静态类型的。所有东西在编译时都需要有一个类型。每个对象的“形状”应该存在于某处,以便编译器可以验证它在代码中是否被正确处理,并且您不会期望从对象中得到它无法做到的东西(JavaScript原谅你这样的事情,但 Java 不会)。每种类型最终都会驻留在 .class 文件中,JVM 在运行时可以使用该文件。

正如我已经说过的,您无法内联定义类型。但这并不意味着您需要为每种类型创建单独的文件。在Java中,我们有一个概念nested classes 。请注意,将两个不相关的类相互嵌套并不是一个好主意,通过在另一个类中声明一个类,您是在说封闭类以某种方式使用嵌套类(或者至少代码的读者会期望)。

这就是如何使用 Java 16 records 定义此类类型:

public record MonthHours(Month month, double hours) {}

它相当于以下类:

public class MonthHours {
private Month month;
private double hours;

public MonthHours(Month month, double hours) {
this.month = month;
this.hours = hours;
}

// getters, equals/hashCode, toString
}

关于Java:特定对象作为 Iterable 中的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72705102/

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