我想问一下java类型的擦除规则.
如果我们有课程:
public class Shape{}
public class Circle extends Shape{}
public class Base<T extends Shape>{
T x;
public void setX(T t){}
}
public class MainClass(){
public static void main(String... _arg){
Base<? extends Shape> bs = new Base<Circle>();
bs.setX(new Circle()); // <- compilation problem
}
}
Run Code Online (Sandbox Code Playgroud)
你能解释一下为什么调用setX()方法会导致编译问题吗?
这些通用之间是否存在任何实际差异
public class SelfBounded <T extends SelfBounded<T>>{}
Run Code Online (Sandbox Code Playgroud)
还有这个
public class SelfBounded <T extends SelfBounded>{}
Run Code Online (Sandbox Code Playgroud)
?
如果是,那我该如何观察呢?
我想问一下为什么以下代码会导致错误:
class A
{
A()
{
statObj.x = 5;
}
int x;
static A statObj = new A();
}
Run Code Online (Sandbox Code Playgroud)
我得到了ExceptionInInitializerError.我不明白为什么.在这种情况下,静态变量statObj
将初始化为第一个.所以,如果我是对的,静态对象statObj = new A()
将被创建为第一个.
这个内部静态对象的创建和初始化顺序是什么?在调用内部静态对象构造函数之前,statObj.x是否默认初始化为0值statObj.A()
?如果是这样,为什么statObj.x表现得像它没有被初始化(我打过它默认初始化为0值)?
还有一个为什么这个问题只发生在构造函数而不是方法中?以下代码工作正常:
class A
{
A()
{
}
void met1()
{
statObj.x = 5;
}
int x;
static A statObj = new A();
}
public MainClass
{
public static void main(String[] arg)
{
A a = new A();
a.statObj.met1();
}
}
Run Code Online (Sandbox Code Playgroud)