害怕听起来很愚蠢。最近,我开始使用java/android。我很喜欢它,但出于对一切美好事物的热爱,我遇到了一个我似乎无法理解的操作员。问题是,我甚至不知道它的名字,所以在谷歌上搜索它几乎是不可能的。我没有找到任何关于它的东西,不是因为它不在那里,而是因为我甚至不知道从哪里开始。
操作员为<someObject>
。与List<object>
中使用的运算符相同。事实上,当我在android中使用AsyncTask类时,我对它很着迷,因为我必须做一些类似的事情
MyClass extends AsyncTask<String[], Drawable[], Drawable[]>{
...
如有任何相关信息,我们将不胜感激。
它不是运算符,而是指定泛型类型参数的方式。
最好从Java教程的泛型部分开始,然后是吉拉德·布拉查的论文,然后使用Java泛型常见问题解答来了解其他内容。(Java泛型中有很多复杂的角落。)
它不是运算符,而是声明参数化类型的方式。
在Java5之前,您不能说您的List是"某个事物的列表",只是一个没有类型的列表。因此,当你从列表中取出一个对象时,你必须将其投射回一个特定的类型:
List strings = new ArrayList();
strings.add("hello");
String s = (String) strings.get(0);
使用Java5,您可以使用尖括号指定元素的类型:
List<String> strings = new ArrayList<String>();
strings.add("hello");
String s = strings.get(0);
因为您现在知道了元素的确切类型,所以不再需要强制转换从列表中获得的对象。此外,编译器不允许您在列表中添加不兼容的对象:
List<String> strings = new ArrayList<String>();
strings.add(42); // Compiler error : expected a String, got an int
这与泛型类型和类型安全有关。
在"旧java"中,您只有一个List,它包含对象,而不是类型安全的。
List l = new List();
l.add(new Type1()); // valid
l.add(new SomeOtherType()); // valid
这些天你说
List<Type1> l = new List<Type1>();
l.add(new Type1()); // valid
l.add(new SomeOtherType()); // invalid since it is a list of Type1
列表中的项可以是Type1或它的任何子类。
如果我理解你的问题,那么List<Object> myList = new List<Object>
意味着myList
可以容纳Objects
或其任何子类。这意味着myList可以容纳任何对象,因为它们都是Object
的子类。
在Java 1.5之前,Java的集合类是"非类型化的"(从技术上讲,它们仍然是)。它们只能存储从java.lang.Object派生的项。这有点麻烦,因为您不得不将Object强制转换为假定的包含类型。这导致了各种各样的问题和怪事。
Sun(现在的Oracle)为该语言添加了一个"技巧",允许开发人员为容器或其他对象指定"类型"。正如我所说,这是一个"技巧",编译器执行类型安全检查,但实际上,所发出对象的签名没有更改。它清理了代码并增加了少量的类型安全性,但实际上它只不过是一个客厅把戏。
查找JDK提供的Generics文档和可用的教程。