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'
有没有简单的解决方案来实现这一目标?
你的代码有问题:
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更多细节.
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |