问题描述
最近研究Java泛型,请问怎么创建这个类的实例:public static class Test<E extends Test<E>> {public E get (E e) {return e;}} 问题补充:不好意思,我这个类就是内部类,我试了下你的代码不行。我把这个类声明独立出来如下:public class Test<E extends Test<E>> {public E get (E e) {return e;}}以下声明没有问题,但不用?而用Test类的子类时子类如何声明?Test<?> test = null;
解决方案
即使你使用public class Test<E extends Test<E>> {public E get (E e) {return e;}} 那么他的子类最好轻便一些,照你这样可读性都不好,子类最好这样public class Test1 extends Test<Test1> {}直接Test<Test1> test=new Test<Test1>();声明就好,全部通过
解决方案二:
我感觉你这个除了用?没有其他方法了,当然在不放弃泛型的情况下!因为你这像是一个循环。其实我感觉这样定义public class Test<E extends Test<?>> {public E get (E e) {return e;}} 不错。这样就可以直接用Test<Test1> test=new Test<Test1>();初始化了。public class Test1 extends Test<Test1> {}
解决方案三:
引用测试了你的代码,不行 不是我的代码有问题,而是你给出了一个限定E extends Test<E>,我使用的E是String。你改为public class Warp{public static class Test<E> {public E get (E e) {return e;}} }Warp.Test t = new Warp.Test<String>();String a = t.get(new String("abc"));就行了,如果要E extends Test<E>。那么下面你要使用的类型必须为Test或Test的子类
解决方案四:
通常static修饰的是匿名内部类。上面的有完整写法为:public class Warp{public static class Test<E extends Test<E>> {public E get (E e) {return e;}} }那么调用方法是:Test t = new Warp.Test<String>();String a = t.get(new String("abc"));
解决方案五:
这个类不对,会报变异错误,去掉static 就好了。