以下是与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
}
}
}
答案 0 :(得分:2)
如果代码中有原始类型,则该类中的所有泛型类型信息都会丢失 - 因此,编译器不知道someMethod
返回List
类型为String
。
JLS的相关部分:Raw Types
构造函数的类型(第8.8节),实例方法(第8.4节,第9.4节),或者 非静态字段(第8.3节)未从中继承的原始类型C的M. 它的超类或超接口是对应的原始类型 在相应的通用声明中擦除其类型 下进行。
因此,由于您将方法参数声明为SomeInterface
,这是一种原始类型,您无法利用泛型someMethod
,即使其泛型类型参数与{{1}不同}}