区分返回类型不同的函数[Java],有什么技巧可以解决这个问题吗?

区分返回类型不同的函数[Java],有什么技巧可以解决这个问题吗?,java,generics,overloading,Java,Generics,Overloading,如果两个方法具有相同的名称和名称,则它们具有相同的签名 参数类型 由于java规范,我知道,我们不能有两个名称相同、参数类型相同但返回类型不同的方法。换句话说,不可能重载具有不同返回类型的函数 我们有两种方法: 方法1:getString的返回对象A 方法2:获取字符串s返回ObjectB 由于方法重复,将发生错误。我尝试使用泛型解决它: T getString s返回T对象 现在我可以调用函数,例如: ObjectA=ObjectA getFooBar; 它是有效的 但问题是,我想返回特定的对

如果两个方法具有相同的名称和名称,则它们具有相同的签名 参数类型

由于java规范,我知道,我们不能有两个名称相同、参数类型相同但返回类型不同的方法。换句话说,不可能重载具有不同返回类型的函数

我们有两种方法:

方法1:getString的返回对象A

方法2:获取字符串s返回ObjectB

由于方法重复,将发生错误。我尝试使用泛型解决它:

T getString s返回T对象

现在我可以调用函数,例如: ObjectA=ObjectA getFooBar; 它是有效的

但问题是,我想返回特定的对象,而不将其强制转换为“main”so

ObjectA=getFooBar

而不是

ObjectA=ObjectA getFooBar

有什么技巧可以通过返回类型来区分函数吗?也许再加一个参数?使用界面?我根本不知道如何用Java解决这个问题

我在C++中发现了一个“技巧”,所以它可以用其他语言来制作。
重命名其中一种方法。如果methodA返回的信息与methodB不同,那么即使返回类型相同,也没有语法或设计上的原因来说明它们都应该被称为methodA。如果您完全需要使用相同的方法,那么您应该添加一个参数,让您指定所需的功能。

这可能与您的情况不完全匹配,但可以使用一个或多个接口获得与您的问题类似的内容

在下面的代码中,getString方法调用返回的对象是接口类型,可以绑定到表示结果类型的类

//result type
interface IIinterface0 {
    void someMethod();
}

interface IIinterface1 {
    IIinterface0 get(String s);
}

class ClassA0 implements IIinterface0 {
    @Override
    public void someMethod() {
    }
}

class ClassA1 implements IIinterface0 {
    @Override
    public void someMethod() {
    }
}

class ClassA implements IIinterface1 {
    @Override
    public IIinterface0 get(String s) {
        IIinterface0 obj = new ClassA0();
        System.out.println(s + " " + obj.getClass().getName());
        return obj;
    }
}

class ClassB implements IIinterface1 {
    @Override
    public IIinterface0 get(String s) {
        IIinterface0 obj = new ClassA1();
        System.out.println(s + " " + obj.getClass().getName());
        return obj;
    }
}

public class Test {

    public static void main(String[] args) {

        String s = "myString";

        IIinterface1 objectA = new ClassA();
        objectA.get(s);

        IIinterface1 objectB = new ClassB();
        objectB.get(s);
    }
}
上述印刷品:

myString ttest.classa0 myString ttest.ClassA1


没有什么把戏。正如您所提到的,java语言规范禁止这样做。这个限制BTW是从C++继承的,并且从可以忽略方法返回值的事实出发,即您可以只调用< /P> 格特福

现在需要执行两个get方法中的哪一个?我们不知道也不可能知道

然而,典型的解决方案是存在的。您可以按如下方式定义1个方法:

T getString参数,类类型

现在你不需要施法了。你可以打任何一个电话

String s = get("foo", String.class);

现在的问题是在执行中。你可以 1.编写一个if-else链丑陋但简单的解决方案 2.将实现委托给map中存储的小型实现者,即

interface Get<T> {
    public T get(String arg);
}


class StringGet implements Get<String> {
    public String get(String arg) {....}
}

class IntegerGet implements Get<Integer> {
    public Integer get(Integer arg) {....}
}


.........................

private Map<Class<?>, Get<?>> getters = ................;
T getString参数,类类型{ return Tgetters.gettype.getarg;//强制转换必须在这里。。。
}

为什么不给他们起不同的名字呢?正如你所说的,Java不允许你这么做,所以我建议你重新编写代码以避免这种情况。在您的情况下,编译器或开发人员无法知道在任何给定调用中将调用或甚至应该调用哪个方法。不要寻找一个技巧来解决它,只是不要这样做。
interface Get<T> {
    public T get(String arg);
}


class StringGet implements Get<String> {
    public String get(String arg) {....}
}

class IntegerGet implements Get<Integer> {
    public Integer get(Integer arg) {....}
}


.........................

private Map<Class<?>, Get<?>> getters = ................;