返回信息流最近看泛型时遇到一些问题:
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)?
这是一条镜像帖。来源:北邮人论坛 / java / #22132同步于 2012/4/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
关于泛型擦除的问题
valleychen
2012/4/17镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
代替了 泛型还有什么意义……
【 在 valleychen (若星汉灿烂) 的大作中提到: 】
: 最近看泛型时遇到一些问题:
: 1、书上说,不能使用泛型类型参数创建实例:
: public class MyClass<E> {
: ...................
【 在 MegRyan 的大作中提到: 】
: 代替了 泛型还有什么意义……
:
我是指擦除的原则,请看这篇文章“擦除的原则”这一部分的第5条
http://tech.it168.com/oldarticle/2007-03-02/200703021013218_1.shtml
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);
}
}
用反射倒是可以。但是如果找不到构造函数,会在调用的时候抛出异常。
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> {
: ...................
【 在 wks 的大作中提到: 】
: 用反射倒是可以。但是如果找不到构造函数,会在调用的时候抛出异常。
: [code=java]
: package demo;
: ...................
那为什么在静态方法中,为了类而引用泛型类型参数是非法的呢?还是那个例子:
public class Test<E>{
public static void m(E o1){}//非法
}
没仔细看你的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.*]
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){}//非法
: ...................
【 在 wks 的大作中提到: 】
: [code=java]
: package demo;
: public class Test<T> {
: ...................
漂亮!不愧是大牛!