只是需要一些幫助,這錯誤代碼:顯示在代碼的結尾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)。如果可能的話,任何人都知道更正確的方法來解決這個問題?
我所以它不再使用Integer
但ParticleId
界面剛剛更新的代碼。
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;
}
}
Integer是最後一堂課。 'K擴展Integer'沒有意義。 – shmosel
是的。我只是用來演示。 – bojanv55