Java class 的字段可以是多种类型而不使用泛型吗?
Can a field of a Java class be of multiple types without using generics?
我有一个 class,它的实例将被序列化。因此 class 实现了 Serializable
。 class 有一个 List
类型的字段,当然也必须是 Serializable
。想象一下 class 看起来像这样:
import java.io.Serializable;
import java.util.List;
public class Report implements Serializable {
private static final long serialVersionUID = 12345L;
private List<Record> records = new ArrayList<>();
}
现在我知道 ArrayList
是 Serializable
,但我宁愿将我的字段声明为某种接口类型。
当我们的SonarQube分析代码时,问题就来了。它抱怨说,字段 records
也应该是某种 Serializable
类型,而 SonarQube 是正确的。
但由于该字段是一个实现细节(私有成员),我不想在 class.
上使用泛型
我的问题来了:
使用自应用约束来声明某些接口类型的字段而不使用泛型,是否可以将字段声明为多种(接口)类型?
仅供参考:我知道可以转换为多种类型,但那是完全不同的东西。
Object o = (List<Serializable> & Serializable) new ArrayList<Serializable>();
以上是完全合法的,虽然没有必要。
看起来你的领域是 private
无论如何,所以无论是 List
还是 ArrayList
并不重要。您可以将该字段设为可序列化 ArrayList
并在 getter.
中使用 List
public class Report implements Serializable {
private ArrayList<Record> records = new ArrayList<>();
...
public List<Record> getRecords() {
return this.records;
}
}
(虽然这不能回答一个字段是否可以有多种类型的问题,但它可能是您实际问题的解决方案。)
简短而令人失望的答案是:不,如果不使用泛型或自定义,一个字段不能同时具有多种类型 类。
我正在寻找的是一种将字段(实际上是任何类型的变量)声明为交集类型的方法。
虽然 intersection types 存在于 Java 中,因为在 Java 6 中引入了泛型,但需要 Java 8 中的 lambda 支持并为我们带来了交集转换。尽管如此,变量的交集类型尚未实现。让我们期待最好的结果。
我有一个 class,它的实例将被序列化。因此 class 实现了 Serializable
。 class 有一个 List
类型的字段,当然也必须是 Serializable
。想象一下 class 看起来像这样:
import java.io.Serializable;
import java.util.List;
public class Report implements Serializable {
private static final long serialVersionUID = 12345L;
private List<Record> records = new ArrayList<>();
}
现在我知道 ArrayList
是 Serializable
,但我宁愿将我的字段声明为某种接口类型。
当我们的SonarQube分析代码时,问题就来了。它抱怨说,字段 records
也应该是某种 Serializable
类型,而 SonarQube 是正确的。
但由于该字段是一个实现细节(私有成员),我不想在 class.
上使用泛型我的问题来了: 使用自应用约束来声明某些接口类型的字段而不使用泛型,是否可以将字段声明为多种(接口)类型?
仅供参考:我知道可以转换为多种类型,但那是完全不同的东西。
Object o = (List<Serializable> & Serializable) new ArrayList<Serializable>();
以上是完全合法的,虽然没有必要。
看起来你的领域是 private
无论如何,所以无论是 List
还是 ArrayList
并不重要。您可以将该字段设为可序列化 ArrayList
并在 getter.
List
public class Report implements Serializable {
private ArrayList<Record> records = new ArrayList<>();
...
public List<Record> getRecords() {
return this.records;
}
}
(虽然这不能回答一个字段是否可以有多种类型的问题,但它可能是您实际问题的解决方案。)
简短而令人失望的答案是:不,如果不使用泛型或自定义,一个字段不能同时具有多种类型 类。
我正在寻找的是一种将字段(实际上是任何类型的变量)声明为交集类型的方法。 虽然 intersection types 存在于 Java 中,因为在 Java 6 中引入了泛型,但需要 Java 8 中的 lambda 支持并为我们带来了交集转换。尽管如此,变量的交集类型尚未实现。让我们期待最好的结果。