java8中的有界类型编译错误

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

这两个示例不使用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.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 )
      {

      }
    }
}