当前位置: 首页 > 知识库问答 >
问题:

没有类型作为方法参数的泛型-无法解析它的字段类型[重复]

韩禄
2023-03-14

让我们考虑一个类:

public class Foo<T> {
    public List<String> list = new ArrayList<>();
}
public void test(Foo t) {
    t.list.get(0).contains("test");
}
public void test(Foo<?> t) {
    t.list.get(0).contains("test");
}

共有1个答案

宇文德明
2023-03-14

当使用foo t时,t是一个原始类型,因此它的非静态、非继承成员,如上面代码中的列表也是原始类型。这里是Java语言规范的相关部分(参见上面的链接):

为了方便与非泛型遗留代码的接口,可以将参数化类型(§4.5)的擦除(§4.6)或元素类型为参数化类型的数组类型(§10.1)的擦除用作类型。这样的类型称为原始类型。

更准确地说,原始类型定义为以下类型之一:

和/或

未从其超类或超接口继承的原始类型C的构造函数(§8.8)、实例方法(§8.4,§9.4)或非静态字段(§8.3)的类型是对应于其类型在对应于C的泛型声明中的擦除的原始类型。

只需将列表声明为静态,它就会被解释为字符串列表(用于测试)。

只允许使用原始类型作为对遗留代码兼容性的让步。在Java编程语言中引入泛型后编写的代码中使用原始类型是非常不鼓励的。Java编程语言的未来版本可能不允许使用原始类型。

注意:类型擦除和生成的字节码在这两种情况下是相同的...

 类似资料:
  • 问题内容: 您认为可以创建类似的东西吗? 问题答案: 是的你可以。 用法示例:

  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):

  • 问题总结:我想传递一个带有类型参数(如

  • 问题内容: 在C#中,我实际上可以这样做: 但是由于某种原因,我无法使其在Java中工作。 我要做的是在超类上创建一个静态方法,以便可以将子类转换为XML。 问题答案: 称为: 或更明确地: 更令人困惑的是,您可以拥有既构造泛型类型又具有泛型参数的构造函数。不记得该语法,也从未在愤怒中使用过它(无论如何,最好还是使用静态创建方法)。 强制转换是不安全的,并且您不能编写T.class。因此,将T.c

  • 我正在实现我自己的通用链表类,它有一个名为的实例方法,它可以制作链表的数组副本并返回它。但是,每当我尝试在实例上调用该方法时,我都会收到错误消息“SLList.this不能从静态上下文中引用”。我搜索了一下,有些人说这是因为我没有在实例上调用该方法,但我确实调用了。 下面是该类: 它有一些方法,比如<code>addLast、addFirst</code>它们没有问题。 是我不断收到错误消息的行,

  • 我有一个问题,从抽象类中重写泛型方法。 这是我的抽象类: 当我创建类(B)来实现类(a)时,如下所示: 显示了(getData)方法中的以下编译错误: ”“B。getData“(“字符串函数(字符串)”不是“a”的有效重写。getData'('字符串函数(类型)‘)。dart(无效覆盖) 以及返回语句中的此错误: 类型为“String”的值不能从方法'getData'返回,因为它的返回类型为'St