java8中的有界类型编译错误
这两个示例不使用OracleJava8JDK编译 错误是: 错误:不兼容的类型:无法将对象转换为整数 for(整数i:foo.set) 例1)java8中的有界类型编译错误,java,generics,Java,Generics,这两个示例不使用OracleJava8JDK编译 错误是: 错误:不兼容的类型:无法将对象转换为整数 for(整数i:foo.set) 例1) import java.util.Set; 福班 { 保护集; } 类Foo2扩展了Foo { void doit() { for(整数i:set) { } } } 例2) import java.util.Set; 福班 { 公共集合; 公共静态void main(字符串[]args) { Foo-Foo=新的Foo(); for(整数i:foo.s
import java.util.Set;
福班
{
保护集;
}
类Foo2扩展了Foo
{
void doit()
{
for(整数i:set)
{
}
}
}
例2)
import java.util.Set;
福班
{
公共集合;
公共静态void main(字符串[]args)
{
Foo-Foo=新的Foo();
for(整数i:foo.set)
{
}
}
}
它是bug还是特性?据我所知,泛型不适用于原始类型的字段 这不是一个错误。您需要传递泛型类型以创建新实例:
class Foo<T>
{
public Set<Integer> set;
public static void main( String[] args ) {
Foo<Integer> foo = new Foo(); // changed code
for (Integer i : foo.set )
{
}
}
}
class-Foo
{
公共集合;
公共静态void main(字符串[]args){
Foo Foo=new Foo();//更改的代码
for(整数i:foo.set)
{
}
}
}
这不是一个错误。您需要传递泛型类型以创建新实例:
class Foo<T>
{
public Set<Integer> set;
public static void main( String[] args ) {
Foo<Integer> foo = new Foo(); // changed code
for (Integer i : foo.set )
{
}
}
}
class-Foo
{
公共集合;
公共静态void main(字符串[]args){
Foo Foo=new Foo();//更改的代码
for(整数i:foo.set)
{
}
}
}
奇怪的是,如果将Foo
构造为类型化对象,即使它不是类型化为Integer
,它也会编译,比如说,Foo-Foo=new-Foo()代码>这可能是因为您使用的是原始类型,所有类型信息在其包含的所有字段上都被删除,例如,Set
变成了Set
。为什么还要使用原始类型?@mcemperon这是真实代码中的错误(在重构泛型之后,在祖先类中添加了泛型,但忘记了后代)我需要一些时间来找到原因——这并不明显。奇怪的是,如果你将Foo
构造为一个类型化对象,即使它不是类型化为Integer
——比如说,Foo-Foo=new-Foo()代码>这可能是因为您使用的是原始类型,所有类型信息在其包含的所有字段上都被删除,例如,Set
变成了Set
。为什么还要使用原始类型?@mcemperon这是真实代码中的错误(在重构泛型之后,在祖先类中添加了泛型,但忘记了后代)我需要一些时间来找出原因——这并不明显。关键是类型参数T
实际上没有被使用。错误不在于创建新实例,问题中的代码只是创建了一个原始类型。我理解这一点,我有意识地创建了原始类型。java中不禁止原始类型。这里设置的不是生的类型,而是生的食物。编译器忽略原始对象Foo中的所有字段类型。这很奇怪。@DenisPimenov不要。曾经使用。原始类型。它们不被禁止的唯一原因是因为向后兼容。但在编写新代码时,始终使用类型参数。看见此外,即使是那些可能“禁止使用原始类型”的州。@DenisPimenov这有什么奇怪的?有文件记载,当使用泛型类的原始版本时,该类中的每个泛型类型都将被擦除。因此,您没有设置Set
,而是设置了Set
。关键是类型参数t
实际上没有被使用。错误不在于创建新实例,问题中的代码只是创建了一个原始类型。我理解这一点,我有意识地创建了原始类型。java中不禁止原始类型。这里设置的不是生的类型,而是生的食物。编译器忽略原始对象Foo中的所有字段类型。这很奇怪。@DenisPimenov不要。曾经使用。原始类型。它们不被禁止的唯一原因是因为向后兼容。但在编写新代码时,始终使用类型参数。看见此外,即使是那些可能“禁止使用原始类型”的州。@DenisPimenov这有什么奇怪的?有文件记载,当使用泛型类的原始版本时,该类中的每个泛型类型都将被擦除。所以你没有集
,你有集
。
class Foo<T>
{
public Set<Integer> set;
public static void main( String[] args ) {
Foo<Integer> foo = new Foo(); // changed code
for (Integer i : foo.set )
{
}
}
}