2014-03-26 41 views
5

比如我们有一些AbsractClass集合成为一个原始类型

package inherit; 

import java.util.HashSet; 
import java.util.Set; 

/** 
* TODO: Add comment 
* 
* @author Ruslan Ibragimov 
*/ 
public abstract class AbstractClass<T extends Integer> { 

    private Set<String> strings = new HashSet<>(); 

    private T value; 

    public Set<String> getStrings() { 
     return strings; 
    } 

    public void setStrings(Set<String> strings) { 
     this.strings = strings; 
    } 

    public void addString(String string) { 
     strings.add(string); 
    } 

    public T getValue() { 
     return value; 
    } 

    public void setValue(T value) { 
     this.value = value; 
    } 
} 

还有一些孩子:

package inherit; 

/** 
* TODO: Add comment 
* 
* @author Ruslan Ibragimov 
*/ 
public class InheritClass extends AbstractClass<Integer> { 


} 

让我们做一些简单的测试

package inherit; 

/** 
* TODO: Add comment 
* 
* @author Ruslan Ibragimov 
*/ 
public class TestClass { 

    public static void main(String[] args) { 
     TestClass testClass = new TestClass(); 
     testClass.test(new InheritClass()); 
    } 

    private AbstractClass test(AbstractClass aClass) { 
     for (String string : aClass.getStrings()) { 
      System.out.println(string); 
     } 
     return aClass; 
    } 
} 


Make output: 

Error:(16, 51) java: incompatible types 
required: java.lang.String 
found: java.lang.Object 
for (String string : aClass.getStrings()) { 

为什么出现这种情况?

+0

我不这么认为,因为'getStrings()'返回'Set ' – bsmk

+0

我敢打赌,如果你用无界通配符声明'AbstractClass ',那么你的代码可能会编译。 –

+0

@Joe,没有我明确指定类型:“私人设置 strings = ...” – IRus

回答

0

相反:

private AbstractClass test(AbstractClass aClass) { 

使用

private AbstractClass test(AbstractClass<? extends Integer> aClass) { 

这将解决编译器,如果你检查getStrings的返回值()的代码辅助,你会看到设置打算集。可以方便地阅读Radiodef在评论中提供的链接。

+0

'''AbstractClass '''好了,这不是本质的这个问题。 – IRus

+0

@IRus,虽然你需要解决这个问题,那就是为什么那个答案。 – Lukino