在Java中使用原始类型的方法键入不匹配

时间:2014-05-15 01:41:46

标签: java generics

以下是与Java中使用泛型的类型不匹配相关的几个问题,但我无法找到与我的案例相对应的任何内容。

我想知道为什么在下面的代码中会发生这个错误?

  

类型不匹配:无法从元素类型Object转换为String

在行

  

for(String element:arg.someMethod())

但是如果

SomeInterface arg

更改为

SomeInterface<?> arg

它有效。如果列表参数类型未连接到接口类型参数,为什么会删除列表参数类型?

import java.util.List;

public class TypeMismatchExample
{
    interface SomeInterface<P extends Object>
    {
        P someParametrizedMethod();

        List<String> someMethod();
    }

    void example(SomeInterface arg)
    {
        for (String element : arg.someMethod())
        {
            // do something
        }
    }
}

1 个答案:

答案 0 :(得分:2)

如果代码中有原始类型,则该类中的所有泛型类型信息都会丢失 - 因此,编译器不知道someMethod返回List类型为String

JLS的相关部分:Raw Types

  

构造函数的类型(第8.8节),实例方法(第8.4节,第9.4节),或者   非静态字段(第8.3节)未从中继承的原始类型C的M.   它的超类或超接口是对应的原始类型   在相应的通用声明中擦除其类型   下进行。

因此,由于您将方法参数声明为SomeInterface,这是一种原始类型,您无法利用泛型someMethod,即使其泛型类型参数与{{1}不同}}