2

我很想知道这是否像我认为的那样有效。我确实意识到泛型在运行时只是作为对象结束。这只是我在 Eclipse 中遇到的一个问题。在查看 Java 如何解决 Collections.emptyList() 中泛型的转换问题时,我发现了这个结构。当我从正在使用的任何界面中删除列表时,我已经厌倦了抑制警告。

<T> List<T> emptyList()

在我看来,它正在阅读作业中的通用演员表。例如,这些工作中的任何一个都不会引发任何类型的转换错误。

List<Object> list = Collections.emptyList();
List<MyObect> list2 = Collections.emptyList();

任何人都可以向我指出有关其工作原理的文档。我什至不知道该怎么称呼它来搜索它。

4

3 回答 3

1

emptyList它是从分配给它的变量的声明中推断出的类型。如果您想自己指定,可以使用

Collections.<MyObject>emptyList();

这可能很有用,例如,在方法中Arrays.asList。该方法允许您编写如下代码:

List<String> myList = Arrays.asList("a", "b", "c");

但如果你有 a String[]asList会给你 aList<String[]>而不是 a List<String>。您可以按如下方式覆盖它:

List<String> myList = Arrays.<String>asList(myStringArray);

更多关于泛型方法中的类型推断的信息

于 2013-03-19T21:00:40.993 回答
0

Java “类型推断”文档应该回答与此相关的大多数问题。

类型推断是 Java 编译器查看每个方法调用和相应声明以确定使调用适用的类型参数(或参数)的能力。推理算法确定参数的类型,以及分配或返回结果的类型(如果可用)。最后,推理算法试图找到适用于所有参数的最具体的类型。

为了说明最后一点,在以下示例中,推理确定传递给 pick 方法的第二个参数是 type Serializable

static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());

你可以改变

List<MyObect> list2 = Collections.emptyList();

List<MyObect> list2 = Collections.<MyObject>emptyList();

为了明确<T>应该绑定到<MyObject>,尽管对于变量初始化器,它应该自动推断。

于 2013-03-19T21:00:32.880 回答
0

不确定你到底在问什么。如果你想在没有编译器警告你的情况下执行强制转换,我们可以欺骗编译器这样做

String string = "hello";
Number number = bruteCast(string);

@SuppressWarnings("unchecked")
public static <A,B> B bruteCast(A a)
{
    return (B)(Object)a;
}

当然,您必须谨慎使用它,确保每次调用bruteCast()都确实正确。

于 2013-03-19T21:06:29.437 回答