2017-07-27 111 views
2

只是需要一些幫助,這錯誤代碼:顯示在代碼的結尾Java泛型 - 不兼容的類型

interface ParticleId{ 
    int getX(); 
} 

class ParticleId1 implements ParticleId{ 
    int a; 
    @Override 
    public int getX() { 
     return a; 
    } 
} 

class ParticleId2 implements ParticleId{ 
    int a,b; 
    @Override 
    public int getX() { 
     return a+b; 
    } 
} 

interface ParticleInt<K extends ParticleId, O extends ParticleInt<K, O>>{ 
    O withSmt(); 
} 

class Particle<K extends ParticleId> implements ParticleInt<K, Particle<K>>{ 
    @Override 
    public Particle<K> withSmt() { 
     return new Particle<>(); 
    } 
} 

class Particle2<K extends ParticleId> extends Particle<K>{ 
    @Override 
    public Particle2<K> withSmt() { 
     return new Particle2<>(); 
    } 
} 

interface Executable<P extends Particle<? extends ParticleId>>{ 
    void setExecutableStrategy(ExecutableStrategy<P> s); 
} 

interface ExecutableStrategy<P extends Particle<? extends ParticleId>>{ 
    Stream<P> exec(List<P> l); 
} 

class Particle2Strat implements ExecutableStrategy<Particle2<? extends ParticleId>>{ 
    @Override 
    public Stream<Particle2<? extends ParticleId>> exec(List<Particle2<? extends ParticleId>> l) { 
     return l.stream().map(x -> x.withSmt()); 
    } 
} 

class ParticleStrat<P extends Particle<? extends ParticleId>> implements ExecutableStrategy<P>{ 
    @Override 
    public Stream<P> exec(List<P> l) { 
     return l.stream().map(x -> x.withSmt()); 
     // [44,38] incompatible types: inference variable R has incompatible bounds 
     // equality constraints: P 
     // [ERROR] lower bounds: Particle<capture#1 of ? extends ParticleId> 
    } 
} 

錯誤,並確切的描述是[44,38] incompatible types: inference variable R has incompatible bounds. equality constraints: P. [ERROR] lower bounds: Particle<capture#1 of ? extends ParticleId>

快速修復,我發現工作纔剛剛手動像(P)x.withSmt()鑄造lambda來(P)。如果可能的話,任何人都知道更正確的方法來解決這個問題?

我所以它不再使用IntegerParticleId界面剛剛更新的代碼。

UPDATE

更新後,我現在有這樣的問題:

class ParticleStrat<P extends ParticleId> implements ExecutableStrategy<Particle<P>>{ 
    @Override 
    public Stream<Particle<P>> exec(List<Particle<P>> l) { 
     return l.stream().map(x -> x.withSmt()); //OK NOW 
    } 
} 

class MainExecutable<P extends Particle<? extends ParticleId>> implements Executable<P>{ 

    private ExecutableStrategy<P> s; 

    public MainExecutable() { 
     this.s = new ParticleStrat<>(); 
     //incompatible types: cannot infer type arguments for ParticleStrat<> 
     //no instance(s) of type variable(s) P exist so that ParticleStrat<P> conforms to ExecutableStrategy<P> 
    } 

    @Override 
    public void setExecutableStrategy(ExecutableStrategy<P> s) { 
     this.s = s; 
    } 
} 
+0

Integer是最後一堂課。 'K擴展Integer'沒有意義。 – shmosel

+0

是的。我只是用來演示。 – bojanv55

回答

1

更改ParticleStrat類的聲明如下解決了編譯錯誤:

class ParticleStrat<P extends ParticleInt<P>> implements ExecutableStrategy<P>{ 
    @Override 
    public Stream<P> exec(List<P> l) { 
     return l.stream().map(x -> x.withSmt()); 
    } 
} 

這樣x.withSmt()保證返回P

編輯按照你的問題的變化:

這通過編譯:

class ParticleStrat<K extends Integer> implements ExecutableStrategy<Particle<K>>{ 
    @Override 
    public Stream<Particle<K>> exec(List<Particle<K>> l) { 
     return l.stream().map(x -> x.withSmt()); 
    } 
} 

以及最新的更新後:

class ParticleStrat<K extends ParticleId> implements ExecutableStrategy<Particle<K>>{ 
    @Override 
    public Stream<Particle<K>> exec(List<Particle<K>> l) { 
     return l.stream().map(x -> x.withSmt()); 
    } 
} 

至於你的最新的問題,同樣的方法也工作:

class MainExecutable<K extends ParticleId> implements Executable<Particle<K>>{ 

    private ExecutableStrategy<Particle<K>> s; 

    public MainExecutable() { 
     this.s = new ParticleStrat<>(); 
    } 

    @Override 
    public void setExecutableStrategy(ExecutableStrategy<Particle<K>> s) { 
     this.s = s; 
    } 
} 
+0

是的。這很容易工作。你能否檢查一下我的更新代碼,在那裏我添加了更多的仿製藥以反映我真正的問題?我認爲這更不相似? – bojanv55

+0

@ bojanv55'K延伸Integer'和'?擴展Integer'沒有意義,因爲Integer是最終的。也許你應該想出一些更有意義的代碼。 – Eran

+0

對不起,只是增加了整數着急(在實際的代碼是一個實際的對象)。如果這是實際問題,我會按照更新代碼。 – bojanv55