BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #22132同步于 2012/4/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

关于泛型擦除的问题

valleychen
2012/4/17镜像同步9 回复
最近看泛型时遇到一些问题: 1、书上说,不能使用泛型类型参数创建实例: public class MyClass<E> { public static void myMethod(Object item) { if (item instanceof E) { //Compiler error ... } E item2 = new E(); //Compiler error E[] iArray = new E[10]; //Compiler error E obj = (E)new Object(); //Unchecked cast warning } } 在编译的时候会报错是因为编译器去除了所有和参数(由类型参数E代表)相关的信息,但是为什么不能用new Object()来代替呢? 2、在泛型类中定义静态变量时错误的: public class Test<E>{ public class void m(E o1){ }//非法的 public static E o1;//非法的 } 是因为该变量会被所有实例共享,但是按照擦除的原则,为什么不能用Object代替(public static Object o1)?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
MegRyan机器人#1 · 2012/4/17
代替了 泛型还有什么意义…… 【 在 valleychen (若星汉灿烂) 的大作中提到: 】 : 最近看泛型时遇到一些问题: : 1、书上说,不能使用泛型类型参数创建实例: : public class MyClass<E> { : ...................
valleychen机器人#2 · 2012/4/17
【 在 MegRyan 的大作中提到: 】 : 代替了 泛型还有什么意义…… : 我是指擦除的原则,请看这篇文章“擦除的原则”这一部分的第5条 http://tech.it168.com/oldarticle/2007-03-02/200703021013218_1.shtml
rulaifozu机器人#3 · 2012/4/17
bd
wks机器人#4 · 2012/4/17
public class Foo { public Foo(int i) { System.out.println("You are calling constructor Foo(int i)"); } } public class Main { public static <E> E createObject(Class<E> cls) { return new E(); // Can you do this? If E were Foo, there is no constructor without parameter. } public static void main(String[] args) { Foo foo = createObject(Foo.class); } }
wks机器人#5 · 2012/4/18
用反射倒是可以。但是如果找不到构造函数,会在调用的时候抛出异常。 package demo; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class ForceNew { public static class Foo { public Foo() { System.out.println("Creating Foo by new Foo()"); } } public static class Bar { public Bar(Integer i) { System.out.format("Creating Bar with Bar(%d)\n", i); } } public static <T> T createObjectNoParam(Class<T> cls) throws InstantiationException, IllegalAccessException { return cls.newInstance(); } public static <T> T createObjectWithParams(Class<T> cls, Object... params) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { Class<?>[] parameterTypes = new Class<?>[params.length]; for (int i = 0; i < params.length; i++) { parameterTypes[i] = params[i].getClass(); } Constructor<T> constructor = cls.getConstructor(parameterTypes); return constructor.newInstance(params); } public static void main(String[] args) throws Exception { try { System.out.println("Creating Foo without param..."); Foo foo = createObjectNoParam(Foo.class); System.out.println(foo); } catch (Exception e) { e.printStackTrace(); } try { System.out.println("Creating Bar without param..."); Bar bar = createObjectNoParam(Bar.class); System.out.println(bar); } catch (Exception e) { e.printStackTrace(); } try { System.out.println("Creating Bar with param..."); Bar bar = createObjectWithParams(Bar.class, 42); System.out.println(bar); } catch (Exception e) { e.printStackTrace(); } } } 【 在 valleychen 的大作中提到: 】 : 最近看泛型时遇到一些问题: : 1、书上说,不能使用泛型类型参数创建实例: : public class MyClass<E> { : ...................
valleychen机器人#6 · 2012/4/18
【 在 wks 的大作中提到: 】 : 用反射倒是可以。但是如果找不到构造函数,会在调用的时候抛出异常。 : [code=java] : package demo; : ................... 那为什么在静态方法中,为了类而引用泛型类型参数是非法的呢?还是那个例子: public class Test<E>{ public static void m(E o1){}//非法 }
MegRyan机器人#7 · 2012/4/18
没仔细看你的Link,我感觉这种说法是有问题的 而且那个跟你举的例子不是一回事 PS:这种东西你应该看sun官方文档、ibm developerworks或者经典书籍 比如<Effectiv e java 2>里面的权威说法,不该随便在网上找篇文章。 建议你看一下<Effective java 2>关于泛型的章节。虽然有点苦涩,但是写的很透彻。 【 在 valleychen (若星汉灿烂) 的大作中提到: 】 : 标 题: Re: 关于泛型擦除的问题 : 发信站: 北邮人论坛 (Tue Apr 17 22:29:52 2012), 站内 : : : 【 在 MegRyan 的大作中提到: 】 : : 代替了 泛型还有什么意义…… : : : 我是指擦除的原则,请看这篇文章“擦除的原则”这一部分的第5条 : http://tech.it168.com/oldarticle/2007-03-02/200703021013218_1.shtml : -- : : ※ 来源:·北邮人论坛 http://bbs.byr.cn·[FROM: 59.64.132.*]
wks机器人#8 · 2012/4/18
package demo; public class Test<T> { public void foo(T t) { } public static void bar(T t) { } public static void main(String[] args) { Test<String> t1 = new Test<String>(); t1.foo("hello"); Test<Integer> t2 = new Test<Integer>(); t2.foo(42); Test.bar("baz"); // How to give Test (the class) a parameter? Test<String>.bar("baz"); // This does not work. } } 【 在 valleychen 的大作中提到: 】 : 那为什么在静态方法中,为了类而引用泛型类型参数是非法的呢?还是那个例子: : public class Test<E>{ : public static void m(E o1){}//非法 : ...................
valleychen机器人#9 · 2012/4/18
【 在 wks 的大作中提到: 】 : [code=java] : package demo; : public class Test<T> { : ................... 漂亮!不愧是大牛!