小编Iza*_*rek的帖子

Java泛型类型擦除

我想问一下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()方法会导致编译问题吗?

java generics erasure

11
推荐指数
1
解决办法
536
查看次数

自我约束的泛型

这些通用之间是否存在任何实际差异

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)

如果是,那我该如何观察呢?

java generics

8
推荐指数
1
解决办法
1670
查看次数

Java初始化顺序错误

我想问一下为什么以下代码会导致错误:

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)

java static

2
推荐指数
1
解决办法
131
查看次数

标签 统计

java ×3

generics ×2

erasure ×1

static ×1