具有强制转换的通用基元类型

Pat*_*ski 4 java generics casting

我的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);
    }

}
Run Code Online (Sandbox Code Playgroud)

关键是,我希望我的默认方法destroyArray可以使用任何类型,如下所示:

public interface Destroyable {

    void destroy();

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

}
Run Code Online (Sandbox Code Playgroud)

它给了我错误:

不可转换的类型; 无法将'int'强制转换为'E'

有没有简单的解决方案来实现这一目标?

Zab*_*uza 9

对象的默认值

你的代码有问题:

default <E> void destroyArray(E[] array) {
    Arrays.fill(array, (E) 0);
}
Run Code Online (Sandbox Code Playgroud)

是一般E类型当然不一定是int(或可以自动装箱的东西Integer).但是你想要实际写一些默认值.因此,您需要创建有效的实例E.一般来说,这很难,因为你对类型一无所知,包括它的构造函数.

但是,所有Objects 都有一个有效值,即null.它表明目前根本没有实例.

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

default <E> void destroyArray(E[] array) {
    Arrays.fill(array, null);
}
Run Code Online (Sandbox Code Playgroud)

基元

但是,你仍然无法填充原始类型的数组,int[]因为E它只能用于Objects,而不能用于原语.您需要为每个基元硬编码其他方法:

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

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

// ...
Run Code Online (Sandbox Code Playgroud)

注意 Class<E>

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

Class<E>是一个Class对象,一个提供Reflection-API访问以分析类内容的包装器.就像获取方法的名称和类似的东西.而E课程本身.

所以Person是一个Person类,Class<Person>就像一个知道类的东西的Person类,比如它的方法名.

查看文档Class更多细节.