如果没有泛型,可以使用不同类型的元素创建ArrayList
。我想迭代它并推出元素。我不能使用for-each-loop,因为它需要特定类型。我试过了Iterator
但是没有成功。
所以我有两个问题:
是否可以遍历数组列表并推出(例如使用System.out.println
)所有元素,无论它们属于哪种类型?
是否可以遍历数组列表,并且只输出 类型特定类型的元素(例如只有字符串)?
答案 0 :(得分:3)
Sure!
The toString
method is defined on the Object
class. The Object
class is the base class of every user-defined class. You could easily write:
for (Object item: itemList) {
// prints all items
System.out.println(item);
if (item instanceof YourDesiredClass) {
YourDesiredClass specificItem = (YourDesiredClass) item;
//doSomethingElse(specificItem)
}
}
答案 1 :(得分:3)
是否可以遍历数组列表并输出(例如, 与System.out.println)所有元素无论哪种文件类型 他们是?
是的,您可以使用Object类
List<Object> myList = new ArrayList<>();
myList.add("Hello World"); // string
myList.add(Math.PI); // a double
myList.add(188); // an int
myList.add(9099099999999L); // a Long
// for java8
myList.forEach(System.out::println);
//before java8
for (Object object : myList) {
System.out.println(object);
}
是否可以遍历数组列表并仅输出 具有特定文件类型的元素(例如只有字符串)?
是的,您可以使用迭代器并让Object根据您需要的类进行检查....
Iterator<Object> it = myList.iterator();
while (it.hasNext()) {
Object x = it.next();
if (x instanceof String) {
System.out.println("this is a String: " + x);
}
}
答案 2 :(得分:3)
据我所知,是的。
你可以创建包含Objects的ArrayList
(参见Java类Object),因为你在Java中定义的每个类至少扩展了一个顶级类Object。
现在让我回答你的问题:
是的,确实如此。列表中的每个对象都知道它是哪个类的实例,并且具有方法toString()
。当您浏览ArrayList并为每个对象调用toString()
时,将调用最具体的方法toString()
。例如,如果它是Integer的实例(让它说它被称为数字)并将它转换为Object,请调用number.toString();
,尽管编译器现在将该数字视为对象,它将从Integer类调用toString()
方法。这称为动态多态性
是的,你可以检查哪个类是Object的实例。这些对象中的每一个都有这些信息;将它转换为Object类就像对编译器说的那样#34;这里有一些对象,我希望你把它看作类Object的实例&#34; - 就像把眼镜放到编译器上一样。 对象知道它是哪个类,所以你可以问,例如:
if(myObject instanceof String){
//do something;
}
希望它有所帮助,我试图以最好的方式解释它,以便你了解发生了什么&#34;引擎盖下&#34; :)
答案 3 :(得分:2)
只是对象
new ArrayList<Object>().iterator().forEachRemaining(element -> {
System.out.println(element);
});
特定类型
new ArrayList<Object>().stream().filter(element -> element instanceof String).iterator()
.forEachRemaining(System.out::println);
编辑:这个答案需要Java 8
答案 4 :(得分:1)
是否可以遍历数组列表并将所有元素(例如,使用System.out.println)放出来,无论它们属于哪种文件类型?
当然,您可以迭代Object
类的列表(或arraylist)并执行您需要的操作。
是否可以遍历数组列表并仅输出特定文件类型的元素(例如只有字符串)?
是的,您可以使用instanceof
并针对特定类别执行特定操作。
用法示例:
List<Object> genericList = new ArrayList<>();
genericList.add("test");
genericList.add(2);
genericList.add('c');
for (Object object: genericList) {
// "Put" out object (question 1)
System.out.println(object);
// Check object type (question 2)
if (object instanceof AnyClass) {
//doSomething()
}else if (object instanceof AnotherClass){
//doSomethingElse()
}
}
答案 5 :(得分:0)
您始终可以使用所有对象共有的类型。最后一个将始终是Object,因为每个Class都扩展了Object。
但是既然我们不喜欢施展它,那么主要是建立一个基本类的更好方法:
public abstract class FileType
{
public abstract String getTypeName();
public abstract String getTypeDescription();
}
public class JSON extends FileType
{
@Override
public String getTypeName()
{
return "JSON";
}
@Override
public String getTypeDescription()
{
return "JavaScript Object Notation";
}
}
public class TXT extends FileType
{
@Override
public String getTypeName()
{
return "TXT";
}
@Override
public String getTypeDescription()
{
return "Textfile";
}
}
现在你可以创建一个FileType列表并使用它的方法:
List<FileType> fileTypes = new ArrayList<>();
list.add(new JSON()); // JSON fits good in here
list.add(new TXT()); // TXT also
for (FileType fileType : list)
{
System.out.println(fileType.getTypeName()); // have the FileType-Methods savely available
}