2014-03-26 95 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