黑马程序员技术交流社区

标题: 在f泛型为Integer的ArrayList中存放一个String类型的对象。 [打印本页]

作者: 汗血黑马    时间: 2014-3-24 19:32
标题: 在f泛型为Integer的ArrayList中存放一个String类型的对象。
本帖最后由 汗血黑马 于 2014-3-25 11:04 编辑

我觉得需要先要把它转换成接收String型的泛型,然后再存入对象,你们觉得呢?如何实现.
作者: osully    时间: 2014-3-24 20:06
反射可以
应该必须处于成员位置才可以
作者: 透过生活    时间: 2014-3-24 20:23
这个反射是完全可以做到的。而且不用转类型。
List<Inteter> list = new ArrayList<String>();

list.getClass().getMethod("add",String.class).invoke(list,"abc");

这样就存放进去了。

你还没学反射吧。java虚拟机在编译后,就会去类型化,这样用反射就不会报异常。
作者: 刘先斌    时间: 2014-3-24 20:35
ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
1.刚刚看到的时候,也是很纳闷后来仔细看了下,java的反射机制;
2.这个可以通过java的反射机制来实现;
3.下面是一个例子:
package com.credream.refelect;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class TestFile {
public static void main(String[] args) throws Exception {
List<Integer> list = new ArrayList<Integer>(); //定义Integer泛型
String str = "abc";
Method[] method=list.getClass().getMethods();//取得list的所有方法
System.out.println(method.length);
for(int i=0;i<method.length;i++){
System.out.println(method[i]);//遍历打印list的方法
}
method[0].invoke(list, str);//通过反射来执行list的第一个方法,第一个是list对象,代表该对象的方法,第二个是方法参数
System.out.println(list.size());
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}

作者: Teale    时间: 2014-3-24 20:55
在JAVA中泛型只是对编译器有用而已,就是说定义泛型只是表面现象,在加载进JUM虚拟机时就会去掉泛型。这样的话,就可以用到反射了,反射是直接绕过编译器,调用类加载器。其实还有很多现象,比如单例设计模式、封装都可以用反射来破。
这个的具体代码上面已经有人写了我就不写了,记住原理,类名.class   对象名.getclass  Class.forname(内存地址)都可以创建出对象的字符码,也就是Class ,这个字符码可以做很多很多事情,包括改方法 Method  改成员Field 和构造方法 construct 。
作者: itpower    时间: 2014-3-24 22:53
用反射就可以的,因为泛型只是在编译的时候才会用到,反射是在执行的时候存对象进去,所以用反射是没问题的..
作者: GoodBoy123    时间: 2014-7-20 23:06
刘先斌 发表于 2014-3-24 20:35
ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
1.刚刚 ...

怎么我复制你的代码试了一下不行啊。


。。。。。。。。。。。。。。。。。。。。。。。。。。
35
public java.lang.Object java.util.ArrayList.clone()
public void java.util.ArrayList.add(int,java.lang.Object)
public boolean java.util.ArrayList.add(java.lang.Object)
public boolean java.util.ArrayList.contains(java.lang.Object)
public java.lang.Object java.util.ArrayList.get(int)
public int java.util.ArrayList.indexOf(java.lang.Object)
public boolean java.util.ArrayList.isEmpty()
public int java.util.ArrayList.lastIndexOf(java.lang.Object)
public int java.util.ArrayList.size()
public java.util.List java.util.ArrayList.subList(int,int)
public java.lang.Object[] java.util.ArrayList.toArray(java.lang.Object[])
public java.lang.Object[] java.util.ArrayList.toArray()
public boolean java.util.ArrayList.addAll(int,java.util.Collection)
public boolean java.util.ArrayList.addAll(java.util.Collection)
public java.util.Iterator java.util.ArrayList.iterator()
public boolean java.util.ArrayList.remove(java.lang.Object)
public java.lang.Object java.util.ArrayList.remove(int)
public void java.util.ArrayList.clear()
public java.lang.Object java.util.ArrayList.set(int,java.lang.Object)
public void java.util.ArrayList.ensureCapacity(int)
public void java.util.ArrayList.trimToSize()
public java.util.ListIterator java.util.ArrayList.listIterator(int)
public java.util.ListIterator java.util.ArrayList.listIterator()
public boolean java.util.ArrayList.removeAll(java.util.Collection)
public boolean java.util.ArrayList.retainAll(java.util.Collection)
public int java.util.AbstractList.hashCode()
public boolean java.util.AbstractList.equals(java.lang.Object)
public java.lang.String java.util.AbstractCollection.toString()
public boolean java.util.AbstractCollection.containsAll(java.util.Collection)
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at cn.reflect.TestFile.main(TestFile.java:20)





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2