【问题标题】:Can a java method returns different object?java方法可以返回不同的对象吗?
【发布时间】:2019-10-30 21:21:24
【问题描述】:

假设我有两个类 Person1 和 Person2,它们实现了接口 History。 我想在 History 接口中有一个静态方法,它根据这样的字符串返回 Person1 或 Person2:

public static Object getPerson(String p){
    switch(p){
        case "a":
            return new Person1();
        default:
            return new Person2();
    }
}

我这里没有任何错误。但是如何在另一个类中使用它,以便从 Person1 或 Person2 获取方法?我试着这样做:

Object env = IEnvironment.getPerson(clientEnv);

但我不能写 env.myMethod() 例如。

界面是正确的解决方案吗?如何做到这一点? 谢谢!

【问题讨论】:

  • 该方法永远不会编译,因为它需要一个字符串作为返回类型,而你返回一个 Person1 或一个 Person2
  • 是的,由于其他评论者所说,顶部的方法绝对不应该编译。我们可能需要更多关于这个的信息,为什么你想要一个方法能够返回两种不同的类型? Person1 与 Person2 有何不同?请提供minimal reproducible example,以便我们更好地了解您想要做什么。
  • 你搜索的可能是工厂模式,有一个类似的帖子here和一个列表(这里)[stackoverflow.com/questions/1673841/…
  • 您可能希望实现factory 设计模式的某个版本,在给定相关参数化的情况下,可以将实现相同接口的不同类提供给调用者。请注意,从 OO 的角度来看,很难想象 Person 如何实现 History,而且返回 String 的方法肯定不能返回不同的对象。
  • 感谢您尝试将代码简化为最小示例,但做得不好。对于您的第一个 sn-p,您说 “我在这里没有任何错误。” 这是不可能的,然后您写道您尝试了 IEnvironment.getEnvironment(clientEnv) 这很奇怪,因为您的方法不是 getPerson getEnvironment 然后你写了你不能使用 env.myMethod() 这是另一个不同的方法名称。所以当你创建一个最小的例子时,请保持一致。您的问题目前只是令人困惑。

标签: java interface static


【解决方案1】:

你可以创建一个接口,让这些类实现这个接口。然后从switch就可以返回这个界面了。

 public static History getPerson(String p){
    switch(p){
        case "a":
            return new Person1();
        default:
            return new Person2();
    }
 }

【讨论】:

  • OP 已经说过两个类都实现了接口History,那你为什么建议再创建一个呢?
  • OP 原贴没有提到他们已经在实现一个接口。
  • @locus2k 所以你说OP在第一次发布问题后添加了句子“实现接口History。”
  • 看历史显然我错了,因为它在那里。可以发誓不是,否则我的答案(现已删除)会有所不同
  • @locus2k 不要被历史欺骗,有可能是 OP 添加的。有一个宽限期,有人可以在创建历史条目之前编辑自己的帖子。这段时间持续 5 分钟,或者直到有人写下评论或答案。因此,当您在 Stultuske 写第一条评论(这将取消宽限期)之前看到问题时,您可能是正确的。这么早就没看到这个问题,所以我不知道OP是否添加了一些东西,这就是我问你的原因。
【解决方案2】:

你想要这样的东西吗:

$ java Foo a
Person1
$ java Foo b
Person2
$ cat Foo.java
/**
 * This is just a container so I can do it all in one class.
 */
public class Foo {
    // Static just for packaging purposes
    public static class History {
        public void printMe() { System.out.println("History"); }
    }

    // Static just for packaging purposes
    public static class Person1 extends History {
        public void printMe() { System.out.println("Person1"); }
    }

    // Static just for packaging purposes
    public static class Person2 extends History {
        public void printMe() { System.out.println("Person2"); }
    }

    public static History makePerson(String str) {
        History retVal = (str.equals("a")) ? new Person1() : new Person2();
        return retVal;
    }

    public static void main(String[] args) {
        History person = makePerson(args[0]);
        person.printMe();
    }
}

(经过编辑以对其进行测试并在比较中正确使用 .equals 而不是 ==。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2012-01-30
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多