泛型转换
Casting By Generics
有没有办法将对象转换为 return 方法的通用值?我试过这种方式但是发生了铸造异常:
public <S extends Super> S get(Class<S> clazz) {
return (S) new Super();
}
public class Super {
}
public class Sub1 extends Super {
}
public class Sub2 extends Super {
}
异常:
java.lang.ClassCastException:
Cannot cast com.zarinak.app.model.Super to com.zarinak.app.model.Sub1
有办法吗?
您尝试将新的 Super 对象转换为扩展它的对象类型的方式不正确。
假设您想创建一个 Sub1 对象 - 您使用 Super class 中的构造函数实例化一个 Super 对象,然后告诉编译器该对象实际上是 Sub1,但事实并非如此;它既不包含 Sub1 特定的方法或变量,也没有使用 Sub1 构造函数构造。编译器知道该对象不是 Sub1 并且会在运行时抛出错误。虽然这对于您的代码的当前结构可能不是问题,但当 Sub1 包含 Super 不包含的方法或变量时,它就会成为问题。如果编译器允许这种形式的转换,则尝试在轨道上调用这些方法将是一个重大问题。
这将实现你想要的。通过将 S 泛型类型限制为 Super 的扩展,您可以有效地绕过实例化 Super 对象并从那里进行转换。
public <S extends Super> S get(Class<S> clazz) throws IllegalAccessException, InstantiationException {
S s = clazz.newInstance();
return s;
}
将它作为一个方法,没有任何额外的主体,几乎完全没有意义,你也可以调用 clazz.newInstance()
。不过,这确实确保了对象的 class 扩展了 Super.
有没有办法将对象转换为 return 方法的通用值?我试过这种方式但是发生了铸造异常:
public <S extends Super> S get(Class<S> clazz) {
return (S) new Super();
}
public class Super {
}
public class Sub1 extends Super {
}
public class Sub2 extends Super {
}
异常:
java.lang.ClassCastException:
Cannot cast com.zarinak.app.model.Super to com.zarinak.app.model.Sub1
有办法吗?
您尝试将新的 Super 对象转换为扩展它的对象类型的方式不正确。
假设您想创建一个 Sub1 对象 - 您使用 Super class 中的构造函数实例化一个 Super 对象,然后告诉编译器该对象实际上是 Sub1,但事实并非如此;它既不包含 Sub1 特定的方法或变量,也没有使用 Sub1 构造函数构造。编译器知道该对象不是 Sub1 并且会在运行时抛出错误。虽然这对于您的代码的当前结构可能不是问题,但当 Sub1 包含 Super 不包含的方法或变量时,它就会成为问题。如果编译器允许这种形式的转换,则尝试在轨道上调用这些方法将是一个重大问题。
这将实现你想要的。通过将 S 泛型类型限制为 Super 的扩展,您可以有效地绕过实例化 Super 对象并从那里进行转换。
public <S extends Super> S get(Class<S> clazz) throws IllegalAccessException, InstantiationException {
S s = clazz.newInstance();
return s;
}
将它作为一个方法,没有任何额外的主体,几乎完全没有意义,你也可以调用 clazz.newInstance()
。不过,这确实确保了对象的 class 扩展了 Super.