我正在学习Java中的泛型,并且想知道这是否会被视为编码不佳。
如果我声明ArrayList<Object>
我知道我可以将任何类型的对象放入此列表中,因为所有对象都来自Object。我也知道,当我调用ArrayList.remove(index)
时,从数组中取出的对象是Object类型,并且我需要将其类型转换为我想要使用的对象类型。
现在假设我有Dog
,Cat
和Car
的对象。考虑到它们不是类似的类,将所有三个对象放入数组会不会很糟糕?
答案 0 :(得分:4)
让我们修改Collection
集合 - 有时称为容器 - 只是一个将多个元素组合成一个单元的对象。集合用于存储,检索,操作和传达汇总数据。通常,它们代表形成自然组的数据项....(续)。
看看大胆的话。那应该给你答案。
如果您将ArrayList
中的对象放在不属于相同实现的对象中,那么当您想要从列表中检索对象并将它们强制转换为适当的类型时,您肯定会遇到麻烦。所以你应该避免这样做。
考虑将Dog
和Car
的对象存储在ArrayList
中。
然后对于存储的每个对象,您想调用一些方法,比如barkLoudly()
。现在,此方法可以与Dog
对象一起使用。但是当Car
上调用此内容时, boooom ....会出现Exception
。
答案 1 :(得分:2)
我认为答案是“通常,但并非总是如此”。编码中没有很多严格的规则;如果你看起来足够努力,你总能找到一个例外。但是如果你从一个集合中拉出对象然后你必须转换为正确的类型,这通常是一个设计错误。
尝试创建代码,以便您使用的对象已经具有您想要执行的操作的正确类型。如果你不需要强制转换,那么Object就可以了。如果你确实需要施放,你应该重新考虑你的设计。
答案 2 :(得分:1)
设计将非常糟糕,为了避免所有这类问题,Generics被引入。 但是,只要您拥有相同类型的对象,就可以使用下面的内容。
猫与狗延伸动物
汽车和自行车延伸车辆
但请勿混淆上述两个陈述。
动物类:
public abstract class Animal {
protected String name;
}
狗类:
public class Dog extends Animal {
public Dog(String name) {
this.name=name;
}
}
猫类:
public class Cat extends Animal {
public Cat(String name) {
this.name=name;
}
}
主要课程:
public class Main {
public static void main(String[] args) {
Cat Cat = new Cat("C");
Dog Dog = new Dog("D");
ArrayList<Animal> list = new ArrayList<Animal>();
list.add(Cat);
list.add(Dog);
}
}
答案 3 :(得分:1)
你不应该这样做
让我们这样看,如果我们称之为通用Object
只是一个&#34;&#34;并创建一个(n)(Array
)仅仅&#34;事物的列表&#34;那对你有多大帮助?在一个列表中存储看似没有任何共同点的三件事并不合理。添加了容器,以便程序员可以存储类似事物的组。
如果我们从更多的编程角度来看待它而不是现实世界的观点,它会引发更多的问题。您的代码可能会尝试执行仅Car
可以执行的操作,编译器并不希望您的Dog
类只是尝试turnOnEngine()
,并抛出您没有做过的错误#39;期待。
简而言之,将不相关的项添加到集合中是不好的做法。
答案 4 :(得分:1)
泛型的目的是让编译器为我们进行所有类型检查。因此,我们不需要担心转换或必须记住列表中的实际类型。因此,使用泛型还可以通过使包含的类型更明确来帮助 记录 您的代码。
你可以:
List<Animal>
答案 5 :(得分:0)
这取决于你想要使用List
for。
您应该声明List
的泛型类型值是最符合您需求的限制,这样您就可以从编译器获得最强的检查,以便在编译时消除错误。
在某些情况下,您可能只想在List
中存储任何类型的对象,在这种情况下您将使用List<Object>
。同样,取决于您要使用List
的内容以及。