2016-02-02 37 views
1

考慮下面的抽象類重寫泛型

public abstract class AbstractAssembler { 

    public abstract <T extends AbstractValue> void transform(T value); 

} 

和下面的延伸:

public class MyAssembler extends AbstractAssembler { 

    @Override 
    public void transform(MyValue value) { 
     // ... 
    } 

} 

隨着MyValue

public class MyValue extends AbstractValue { 

    // ... 

} 

Eclipse的告訴我: 變換方法(myvalue的) MyAssembler類型必須覆蓋或實現一個超類型met hod

爲什麼這不起作用?

+2

只需使用'AbstractAssembler ','公共抽象無效變換(T值);'和'公共類MyAssembler擴展AbstractAssembler'。 – Tom

+0

@Tom你應該發佈它作爲答案... – assylias

+0

想象一下以下情況:'AbstractAssembler a = new MyAssembler(); a.transform(new MyOtherValue());'......第二行應該做什麼? – assylias

回答

5

transform()方法必須覆蓋超類的一般抽象transform()方法,即你應該是這樣的:

public class MyAssembler extends AbstractAssembler { 

    @Override 
    public <T extends AbstractValue> void transform(T value) { 

    } 
} 

如果你想用一個實際的類型來調用它(如MyValue),你應該做的:

MyValue value = new MyValue(); 
new MyAssembler().transfer(value); 

其中顯式指定類型參數(new MyAssembler().<MyValue>transfer(value);)是可選的,因爲它會被編譯器推斷。


不過,若你希望MyAssembertransform方法工作MyValue,那麼你應該做的:

public class MyAssembler extends AbstractAssembler<MyValue> { 

    @Override 
    public void transform(MyValue value) { 

    } 
}