gpt4 book ai didi

java - 具有类型转换的通用原始类型

转载 作者:搜寻专家 更新时间:2023-11-01 01:05:52 25 4
gpt4 key购买 nike

我的 Java 代码有问题。我想通过使用泛型类型使我的方法通用。用代码解释更简单:

public interface Destroyable {

void destroy();

default void destroyArray(byte[] array) {
Arrays.fill(array, (byte)0);
}

default void destroyArray(char[] array) {
Arrays.fill(array, (char)0);
}

}

重点是,我希望我的默认方法 destroyArray 可以处理任何类型,如下所示:

public interface Destroyable {

void destroy();

default <E> void destroyArray(Class<E>[] array) {
Arrays.fill(array, (E)0);
}

}

它给我错误:

Inconvertible types; cannot cast 'int' to 'E'

是否有任何简单的解决方案来实现这一点?

最佳答案

对象的默认值

你的代码的问题:

default <E> void destroyArray(E[] array) {
Arrays.fill(array, (E) 0);
}

是将军E type 当然不一定是 int (或者像 Integer 这样可以自动装箱的东西)。但是您实际上想写一些默认 值。因此,您需要创建 E 的有效实例.这通常很难,因为您对该类型一无所知,包括其构造函数。

但是,所有 Object 都有一个有效值s,即null .它表示目前根本没有实例。

因此以下内容适用于任意类型 E :

default <E> void destroyArray(E[] array) {
Arrays.fill(array, null);
}

原语

但是,您仍然无法填充原始类型数组,如 int[]E只能用于 Object s,不是原语。您需要为每个原语硬编码额外的方法:

default void destroyArray(int[] array) {
Arrays.fill(array, 0);
}

default void destroyArray(double[] array) {
Arrays.fill(array, 0.0);
}

// ...

注意Class<E>

您的原始代码有 Class<E>[]而不是 E[] .注意 Class<E>意味着与 E[] 完全不同的东西.

Class<E>Class对象,一个包装器,提供反射 API 访问以分析类的内容。比如获取方法名称之类的。鉴于 E是类本身。

所以 Person将是 Person类和 Class<Person>就像一个了解 Person 的类类,如它的方法名称。

参见 documentationClass了解更多详情。

关于java - 具有类型转换的通用原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50796328/

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