2013-06-19 72 views
3

我在抓取泛型时遇到了一些麻烦。我已经阅读了Oracle关于泛型的教程,它似乎没有解决我的问题。我也不知道在寻找答案时要寻找什么。实现方法的Java类,其参数在接口中指定的子类型

比方说,我有以下代码:

public abstract class Buff<V> { 
    public V value; 
{ 

public interface Buffable<V> { 
    public void buff(Buff<V extends Buff> buff); 
} 

public class DoubleBuff extends Buff<double> { 
    public double value; 
} 

public class DoubleBuffable implements Buffable<DoubleBuff> { 
    public void Buff(DoubleBuff buff) { 
     //implementation 
    } 
} 

我希望能够创建一个继承浅黄色,并有成员“价值”类,但指定值的类型(见DoubleBuff)。我还想定义使用Buff子类型的输入参数实现buff方法的类。

DoubleBuffable是一些类,它实现Buffable,但预计的DoubleBuff和不StringBuff的输入。

我是否正确表达我的泛型?

回答

5

首先,语法。声明:

public interface Buffable<V> { 
    public void buff(Buff<V extends Buff> buff); 
} 

应该是:

public interface Buffable<V extends Buff> { 
    public void buff(Buff<V> buff); 
} 

你想要的类型变量,应在类声明中指定。

但是你说:

我也想定义实现使用输入参数是浅黄色的子类型的BUFF方法类。

这样,下面的声明会适合您的发言更好:

public interface Buffable<V extends Buff<?>> { 
    public void buff(V buff); 
} 

你可能想,如果你需要一个更具体的类型的Buff改变这种<?>一部分。

最后,其他必要的变化和最后类:

public abstract class Buff<V> { 
    public V value; 
} 
public interface Buffable<V extends Buff<?>> { 
    public void buff(V buff); 
} 
// instead of primitive types, you should use their wrappers: double-->Double 
public class DoubleBuff extends Buff<Double> { 
    public double value; 
} 
public class DoubleBuffable implements Buffable<DoubleBuff> { 
    public void buff(DoubleBuff buff) { 
     //implementation 
    } 
} 
+0

感谢您的帮助。 – user2501337

2

基元不能用作泛型类型。尝试“双”而不是“双”。

相关问题