Java中的铸造数组过程?(协方差和[LObject)
我的问题是,Java中的强制转换过程到底是怎样的? 假设我们有Java中的铸造数组过程?(协方差和[LObject),java,arrays,covariance,Java,Arrays,Covariance,我的问题是,Java中的强制转换过程到底是怎样的? 假设我们有 User[] users = new User[2];//<-- here we get at runtime [LUser class Object[] objects = (Object[]) users;//<-- here we get at runtime [LObject class public class [LUser extends Object implements Serializable, Cl
User[] users = new User[2];//<-- here we get at runtime [LUser class
Object[] objects = (Object[]) users;//<-- here we get at runtime [LObject class
public class [LUser extends Object implements Serializable, Cloneable{
}
public class [LObject extends Object implements Serializable, Cloneable{
}
User[]users=新用户[2];//根据(链接):
以下规则定义数组类型之间的直接超类型关系:
- 如果
S
和T
都是引用类型,则S[]
>1T[]
iffS
>1T
Object
>1Object[]
Cloneable
>1Object[]
java.io.Serializable
>1Object[]
上面的意思是,当然你不能写,但是这是Java中数组子类型规则的等价物
// Rule #2 Rule #3 Rule #4
class Object[] extends Object implements Cloneable, Serializable {
}
// Rule #1
class User[] extends Object[] {
}
更新
此外,他说:
数组类型的成员包括以下所有成员:
public
final
字段length
,其中包含数组的组件数。length
可以是正的,也可以是零
public
方法clone
,该方法重写类对象中同名的方法,并且不抛出任何选中的异常。数组类型T[]
的clone
方法的返回类型为T[]
多维数组的克隆是浅层的,也就是说它只创建一个新数组。子数组是共享的
- 从类
对象
继承的所有成员;对象
唯一未继承的方法是其克隆
方法
这意味着:
class Object[] extends Object implements Cloneable, Serializable {
public final int length = /*value from array creation*/;
public Object[] clone() {
try {
return (Object[]) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}
}
class User[] extends Object[] {
public User[] clone() {
return (User[]) super.clone();
}
}
“这里我们在运行时得到[LObject类”你说的“得到”是什么意思?强制转换不会改变对象的类型:users
仍然具体地说是一个User[]
,因此objects
具体地说是一个User[]
也是。数组是特殊的。它们不像任何其他类那样是类。它们有特定的规则来决定它们的行为。可能是@Sarkhan的重复我真的不知道你在问什么。这表明强制转换不会改变具体的类型。@Sarkhan但是,正如我在第一篇评论中所说,数组不像普通类那样工作。它们有仅适用于它们的特定规则。字符串数组是String[]的实例,也是CharSequence[]的实例,也是Serializable[]的实例,也是Cloneable[]的实例,也是Object[]的实例.对于只有一个超类的常规类,这是不可能的。只有数组。这就是我想要的答案!
class Object[] extends Object implements Cloneable, Serializable {
public final int length = /*value from array creation*/;
public Object[] clone() {
try {
return (Object[]) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}
}
class User[] extends Object[] {
public User[] clone() {
return (User[]) super.clone();
}
}