如何将类的值与包含该类的接口进行比较?

时间:2017-02-03 00:42:21

标签: java

这将是视频中的一种方法,其中IMedia界面可以是视频,文章或录制。只有视频和文章使用“名称”字段。

// is the name of this Video the same 
// as that of the given IMedia?

public boolean sameCorporation(IMedia that) {
  return (this.name == that.name);
}

我知道“this.name == that.name”不起作用,因为界面似乎不知道如何解决。

接口只包含方法主体

//to represent different types of news media
interface IMedia {

  // compute the length of this IMedia
  int length();

  // formats the title, corporation, and episode number of IMedia
  String format();

  // is the corporation of this media the same 
  // as the corporation of the given media?
  boolean sameCorporation(IMedia that);
}

3 个答案:

答案 0 :(得分:3)

IMedia可能没有name字段,子类可以。所以你必须投,但这是一个糟糕的设计。

您可以拥有新界面

public interface Nameable {
    public String getName();
}

你的另一个扩展了

public interface IMedia extends Nameable {
    // other stuff
}

你有一些名字字段的课程

public class Video implements IMedia {
    private String name;
    public String getName() {
        return this.name;
    }

    // Video things
}

某些没有名称仍然实现IMedia的类,只为getName()返回null。

你的比较方法应该没问题

public boolean sameCorporation(IMedia that) {
  // compare strings correctly, avoid nullpointer
  return that != null && Objects.equals(this.name, that.getName()); 
}

此时可能最好使用抽象类。

public interface IMedia extends Nameable {
    // other stuff
    boolean sameCorporation(IMedia that);
}

public abstract class AbstractMedia implements IMedia {

    public abstract String getName();

    public boolean sameCorporation(IMedia that) {
        return that != null && Objects.equals(this.getName(), that.getName()); 
    }
}

答案 1 :(得分:1)

您可以在界面getName()中添加IMedia方法。

interface IMedia {
  String getName();
  int length();
  String format();
  boolean sameCorporation(IMedia that);
}

然后,你可以通过调用这个新方法进行比较。

public boolean sameCorporation(IMedia that) {
  return this.getName() == that.getName();
}

鉴于只有VideoArticle才有名称。您可以在Recording.getName()方法中返回null。

答案 2 :(得分:1)

接口没有属性。它们仅提供在类中实现的方法声明。因此,在您的情况下,IMedia接口应该声明方法getName或类似的东西。

public interface IMedia {
    String getName();
    //...
    //Your other methods
}

你说只有文章和视频有名字。所以你可以定义另一个扩展IMedia的interace。

public interface INamedMedia extends IMedia {
    String getName();
}

然后,您的VideoArticle课程可以实施INamedMedia

我在这里看到的第二件事。 name可能是一个字符串。你永远不应该将字符串与==进行比较。请改用equals方法。

this.getName().equals(that.getName())