有人能给我解释一下在列表类中使用E或Object的区别吗,以及它们的单一用法和定义。我必须在LinkedList中使用它们来实现方法。
你写的语法
泛型提供了一种方法,可以对不同的数据类型重复使用相同的代码,同时在编译时仍然保持严格的类型检查。例如,如您所提到的,如果您使用一个处理Object类型元素的数据结构,那么在添加或获取其元素时就没有类型安全性,因为任何类实例都可以从它传递和检索。这将导致容易出错的代码,从您的数据结构中检索的元素应该首先转换为预期的数据类型,以便使用,或者在最坏的情况下,不属于正确的类型,并且只有在运行时才知道这一点,没有办法阻止它。
正因为如此,泛型帮助开发人员允许他/她为每个不同的情况建立具有特定类型参数的泛型类型参数(非原始类型)。这不仅为您的代码提供了更多的灵活性和可重用性,而且一旦您确定了一个通用的Type Parameter E代表特定的数据类型(整数,字符串或其他),那么编译器将确保您的对象将使用Type Parameter E执行的每一个操作都将符合您放置在E中的特定Type Argument。
public class Test {
public static void main(String[] args) {
//Here I can add mixed non-primitive types because they're also instances of Object and therefor compliant to the expected type
List listObj = new ArrayList();
listObj.add(Integer.valueOf(5));
listObj.add("Hello");
listObj.add(Double.valueOf(3.77));
//Here I can't retrieve the elements with their right type even though I know I've placed an Integer, a String and a Double in its first, second and third position
Integer i1 = listObj.get(0);
String s1 = listObj.get(1);
Double d1 = listObj.get(2);
//Here I'm defining a generic list working only with Integer (for this specific instance)
List<Integer> listGenInt = new ArrayList<>();
listGenInt.add(Integer.valueOf(5));
//If I try to add any other type but Integer I'd get an error at compile time
listGenInt.add("Hello");
listGenInt.add(Double.valueOf(3.77));
//Here I can only expect to retrieve elements of the data type I've established for this object during its declaration (Integer)
Integer i2 = listGenInt.get(0);
//Here I'd get an error If I'd try read its elements with any data type but Integer
String s2 = listGenInt.get(1);
Double d2 = listGenInt.get(2);
//Here I'm defining a generic list working only with String (for this specific instance)
List<String> listGenStr = new ArrayList<>();
listGenStr.add("Hello");
//If I try to add any other type but String I'd get an error at compile time
listGenStr.add(Integer.valueOf(5));
listGenStr.add(Double.valueOf(3.77));
//Here I can only expect to retrieve elements of the data type I've established for this object during its declaration (String)
String s3 = listGenStr.get(1);
//Here I'd get an error If I'd try read its elements with any data type but String
Integer i3 = listGenStr.get(0);
Double d3 = listGenStr.get(2);
}
}
这里还有Oracle官方教程中的示例和进一步解释链接。
https://docs.oracle.com/javase/tutorial/extra/generics/intro.html
假设E来自元素,当编译的方法说它接受了某一类型的数组,并返回相同类型的数组时,我会考虑在集合中使用泛型。
另一方面,你不能把橙子和苹果混在一起。如果可以将字符串列表传递给需要对象列表的方法,则可以将对象添加到字符串列表中。(并非所有对象都是字符串)
本文向大家介绍& 和 && 的区别?相关面试题,主要包含被问及& 和 && 的区别?时的应答技巧和注意事项,需要的朋友参考一下 &运算符是:逻辑与;&&运算符是:短路与。 &和&&在程序中最终的运算结果是完全一致的,只不过&&存在短路现象,当&&运算符左边的表达式结果为false的时候,右边的表达式不执行,此时就发生了短路现象。如果是&运算符,那么不管左边的表达式是true还是false,右边表达
本文向大家介绍AdaBoost和GBDT的区别,AdaBoost和GBDT的区别?相关面试题,主要包含被问及AdaBoost和GBDT的区别,AdaBoost和GBDT的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: AdaBoost通过调整错分的数据点的权重来改进模型,而GBDT是从负梯度的方向去拟合改进模型。 AdaBoost改变了训练数据的权值,即样本的概率分布,减少上一轮被正
本文向大家介绍Cookie和session的区别,localstorage和sessionstorage的区别相关面试题,主要包含被问及Cookie和session的区别,localstorage和sessionstorage的区别时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Cookie和session都可用来存储用户信息,cookie存放于客户端,session存放于服务器端,因为c
本文向大家介绍is和==的区别相关面试题,主要包含被问及is和==的区别时的应答技巧和注意事项,需要的朋友参考一下
本文向大家介绍js中!和!!的区别与用法,包括了js中!和!!的区别与用法的使用技巧和注意事项,需要的朋友参考一下 js中!的用法是比较灵活的,它除了做逻辑运算常常会用!做类型判断,可以用!与上对象来求得一个布尔值, 1、!可将变量转换成boolean类型,null、undefined和空字符串取反都为false,其余都为true。 2、!!常常用来做类型判断,在第一步!(变量)之后再做逻辑取反运