害怕听起来很愚蠢。 最近,我开始使用java / android。 我喜欢它,但是为了所有好的爱,我遇到了一个我似乎无法理解的操作员。 问题是,我甚至不知道它的名字,因此谷歌搜索几乎是不可能的。我没有找到任何关于它的信息,不是因为它不存在,而是因为我甚至不知道从哪里开始。
运营商是<someObject>
。 List<object>
中使用的运算符相同。
当我在android中使用AsyncTask类时,我实际上对它很着迷,我必须做类似
MyClass extends AsyncTask<String[], Drawable[], Drawable[]>{
...
有关此的任何信息将不胜感激。
答案 0 :(得分:7)
它不是运算符 - 它是指定泛型类型参数的方式。
最好从Generics part of the Java Tutorial开始,然后Gilad Bracha's paper开始,然后使用Java Generics FAQ获取其他任何内容。 (Java泛型中存在很多的棘手角落。)
答案 1 :(得分:3)
它不是运算符,而是声明参数化类型的方式。
在Java 5之前,你不能说你的List是一个“List of something”,只是一个没有类型的List。因此,当您从列表中取出一个对象时,必须将其转换回特定类型:
List strings = new ArrayList();
strings.add("hello");
String s = (String) strings.get(0);
使用Java 5,您可以使用尖括号指定元素的类型:
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
答案 2 :(得分:2)
与通用类型和类型安全性有关。
旧的java&#34;你只有一个List,它包含Objects - 不是类型安全的。
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
List中的项目可以是Type1或其任何子类。
答案 3 :(得分:0)
如果我理解了您的问题,则List<Object> myList = new List<Object>
表示myList
可以保留Objects
或其任何子类。这意味着myList可以包含任何对象,因为它们都是Object
的子类。
答案 4 :(得分:0)
在Java 1.5之前,Java的集合类是“无类型的”(技术上它们仍然是)。它们只能存储从java.lang.Object派生的项目。这有点麻烦,因为您被迫将Object强制转换为假定的包含类型。这导致了各种各样的问题和奇怪的事情。
Sun(现在的Oracle),为该语言添加了一个“技巧”,允许开发人员为容器或其他对象指定“类型”。正如我所说,这是一个“技巧”,编译器执行类型安全检查,但实际上对象的签名没有变化。它清理代码并添加少量类型安全,但实际上它只不过是一个客厅技巧。
查看随JDK提供的Generics文档和可用的教程。