2010-07-21 33 views
1

我收到此錯誤與下面的代碼:使用Eclipse太陽神與JDK 1.6.0_16泛型示例不起作用?替代方案或建議?

The method getItemProperty(capture#2-of ? extends GenericTest.Item) in the type GenericTest.BaseContainer<capture#2-of ? extends GenericTest.Item> is not applicable for the arguments (GenericTest.Item)

import org.junit.Test; 

public class GenericTest { 

public class Item { 
    private String value; 

    public String getValue() { 
     return value; 
    } 

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

public class WordItem extends Item { 

} 

public abstract class BaseContainer<T extends Item> { 
    public String getItemProperty(T item) { 
     return item.getValue(); 
    } 
} 

public class Document extends BaseContainer<WordItem> { 
} 

public static class ContainerFactory { 
    public static BaseContainer<? extends Item> getContainer(Item item) { 
    return new GenericTest().new Document(); 
    } 
} 

@Test 
public void theTest(){ 
    Item item = new WordItem(); 
    BaseContainer<? extends Item> container = ContainerFactory.getContainer(item); 
    String str = container.getItemProperty(item); //this line does not compile 
} 
} 

I'm。

+2

什麼是編譯器給你的錯誤? – KLee1 2010-07-21 16:17:04

+0

請在此問題中添加更多信息。或者它有被關閉的危險。 – jjnguy 2010-07-21 16:22:28

+0

這是編譯器錯誤 方法getItemProperty(捕獲#2的?延伸GenericTest.Item)在GenericTest.BaseContainer <捕獲#2的類型?擴展GenericTest.Item>是不適用的參數(GenericTest.Item)使用Eclipse赫利俄斯與JDK 1.6.0_16 – Alex 2010-07-21 16:25:38

回答

1

爲了擺脫錯誤的,你的代碼更改爲:

public static class ContainerFactory { 
    public static <T extends Item>BaseContainer<T> getContainer(Item item) { 
    return (BaseContainer<T>) new GenericTest().new Document(); 
    } 
} 

@Test 
public void theTest(){ 
    Item item = new WordItem(); 
    BaseContainer<Item> container = ContainerFactory.getContainer(item); 
    String str = container.getItemProperty(item); 
} 
+0

非常感謝 I'm ...奏效 – Alex 2010-07-21 16:38:20

2

我認爲這個問題是containerBaseContainer<? extends Item>,即它是一些亞型Item的容器。然而,編譯器無法確保有問題的亞型實際上Item本身的方式。而事實上,這是WordItem,不Item。總體問題是您的通用參數用法不一致並且不完整。

我可以讓你的代碼編譯這些修改:

public class Document<T extends Item> extends BaseContainer<T> { 
} 

public static class ContainerFactory { 
    public static <T extends Item> BaseContainer<T> getContainer(T item) { 
    return new Test().new Document<T>(); 
    } 
} 

@Test 
public void theTest(){ 
    WordItem item = new WordItem(); 
    BaseContainer<WordItem> container = ContainerFactory.getContainer(item); 
    String str = container.getItemProperty(item); 
} 

這不同於TrueSoft的建議在這裏Document也由一般 - 這可能不是你想要的(你給對此沒有資料) ,但至少這種方式有內getContainer()不需要不安全的演員。