IntelliJ说它无法解析getValue()

时间:2018-10-02 16:00:41

标签: java

因此,我们有一个项目,我们应该做一个简单的“计算机”,在该计算机中,我们有一个内存,该内存的地址指向不同种类的单词。

public interface Word extends Operable {
    Word add(Word word1, Word word2);
    Word mul(Word word1, Word word2);
}

然后我们应该能够对这些单词进行操作,其中两个操作是add和mul。然后,可以在各个单词子类中实现Word接口。

public class ByteWord implements Word {
    private Byte value;

    public ByteWord(String stringValue) {
        this.value = Byte.parseByte(stringValue);
    }

    @java.lang.Override
    public ByteWord add(Word word1, Word word2) {
        this.value = word1.getValue() + word2.getValue();
        return this;
    }

    @java.lang.Override
    public ByteWord mul(Word word1, Word word2) {
        this.value = word1.getValue() * word2.getValue();
        return this;
    }

    private Byte getValue() {
        return value;
    }
} 

这里的问题是IntelliJ表示无法解析getValue(),而另一条警告则指出从未使用过getValue()。

将word1和word2的类型更改为ByteWord可以解决此问题,但会出现另一个错误,表明我们实际上并未从Word中添加未实现的方法。

并将它们强制转换为正确的单词类型,在此我们将值分配给this.value,因为我们知道我们将始终发送某种类型,这表示Java期望的字节购买是通过将两个字节加在一起而得到的。 >

在此先感谢您能解决我的问题的任何输入!

2 个答案:

答案 0 :(得分:1)

private Byte getValue() {
    return value;
}

这是属于ByteWord类的方法,而不是Word,因此您不能调用word1.getValue()。您收到的警告是因为您从未在ByteWord对象上调用它。

  

将word1和word2的类型更改为ByteWord可以解决此问题,但会出现另一个错误,表明我们实际上并未从Word中添加未实现的方法。

这是因为您在Word中将方法定义为接受Word参数。

答案 1 :(得分:0)

正如其他答案所说,编译器找不到getValue()方法的原因是因为word1word2Word对象,而Word没有没有getValue()方法,因此您不能在Word对象上调用它。该方法是ByteWord专用的,因此您只能在ByteWord个对象上专门调用它。

但是... word1word2成为Word有意义吗?
如果ByteWordmul两个Word本身不是ByteWord的话,这是否有意义?
如果我有DWord类,这样做是否有意义?

DWord dword = new DWord(10);
ByteWord byte1 = new ByteWord(1);
ByteWord byte2 = new ByteWord(2);
dword.add(byte1, byte2);

我不这么认为。 ByteWordByteWord一起使用,而DWord与其他DWords一起使用是否更有意义?
然后,您可能需要做的是使接口通用:

public interface Word<T extends Word> extends Operable {
    T add(T word1, T word2);
    T mul(T word1, T word2);
}

所以每个类都相应地实现它:

public class ByteWord implements Word<ByteWord> {
    private Byte value;

    public ByteWord(String stringValue) {
        this.value = Byte.parseByte(stringValue);
    }

    @Override
    public ByteWord add(ByteWord word1, ByteWord word2) {
        this.value = (byte) (word1.getValue() + word2.getValue());
        return this;
    }

    @Override
    public ByteWord mul(ByteWord word1, ByteWord word2) {
        this.value = (byte) (word1.getValue() * word2.getValue());
        return this;
    }

    private Byte getValue() {
        return value;
    }
}

public class DWord implements Word<DWord> {
    private Integer value;

    public DWord(String stringValue) {
        this.value = Integer.parseInt(stringValue);
    }

    @Override
    public DWord add(DWord word1, DWord word2) {
        this.value = word1.getValue() + word2.getValue();
        return this;
    }

    @Override
    public DWord mul(DWord word1, DWord word2) {
        this.value = word1.getValue() * word2.getValue();
        return this;
    }

    private Integer getValue() {
        return value;
    }
}

现在您可以写:

    ByteWord byte1 = new ByteWord("1");
    byte1.add(new ByteWord("2"), new ByteWord("3"));
    System.out.println("byte1 = " + byte1.value);

并输出:

  

byte1 = 5

还要写:

    byte1.add(new DWord("2"), new DWord("3"));

看到它不能编译,因为DWord不是ByteWord

但这仍然很奇怪,因为如果您永远不会在计算中使用初始value有什么意义?

因此,也许再说一次,让方法对Word的当前值进行操作(仅接收一个参数)更有意义:

public interface Word<T extends Word> extends Operable {
    T add(T word1);
    T mul(T word1);
}

public class ByteWord implements Word<ByteWord> {
    private Byte value;

    public ByteWord(String stringValue) {
        this.value = Byte.parseByte(stringValue);
    }

    @Override
    public ByteWord add(ByteWord word1) {
        this.value = (byte) (this.value + word1.getValue());
        return this;
    }

    @Override
    public ByteWord mul(ByteWord word1) {
        this.value = (byte) (this.value * word1.getValue());
        return this;
    }

    private Byte getValue() {
        return value;
    }
}

最后,您现在可以编写:

    ByteWord byte1 = new ByteWord("1");
    byte1.add(new ByteWord("2"));
    System.out.println("byte1 = " + byte1.value);

并输出:

  

byte1 = 3

我认为这更有意义。

但是,我不知道您要在问题中包含的代码是您的还是老师的,也不知道您可以修改哪些部分,不能修改哪些部分,所以我只希望我给您一些内容。洞察力。