如何实现用返回值重载

今天 [ IceSharK - PP.Poet ]很清纯地提出了一个问题, 如何能做到函数返回值重载?简单的说,就是如何实现

string Test() {...}
int Test() {...}

然后通过接受方的上下文自动选取重载:

int i = Test();
string s = Test();


当然VB或者C#都是不允许这样写的。不过IL并没有禁止这一写法,事实上在VB或C#中有一种语法结构允许按照返回值选取相应的重载,那就是隐式类型转换运算符(implicit operator或者Widening Operator CType)。通过辅助类的隐式类型转换运算符,我们可以实现上述要求的语法。

class Foo
{
    string TestString()
    {
        return "I'm a string";
    }

    int TestInt()
    {
        return 100;
    }

    public TestHelper Test()
    {
        return new TestHelper(this);
    }

    public struct TestHelper
    {
        Foo m_host;
        public TestHelper(Foo host)
        {
            m_host = host;
        }

        public static implicit operator int(TestHelper helper)
        {
            return helper.m_host.TestInt();
        }

        public static implicit operator string(TestHelper helper)
        {
            return helper.m_host.TestString();
        }
    }
}
调用的语法非常之完美:

Foo f = new Foo();
int i = f.Test();
string s = f.Test();

怎么样,并没有使用很高深的语法,就实现了想要的东西。


### Java 方法重载返回值关系 在Java中,方法重载的关键在于参数列表的不同而非返回值类型。即使两个方法的返回值类型不同,如果其他方面完全相同,则这两个方法仍然被认为是相同的,无法构成有效的方法重载[^1]。 #### 参数列表差异的重要性 为了实现有效的重载,至少需要满足以下条件之一: - 不同数量的参数 - 至少有一个不同类型的参数(顺序也会影响) 例如,在下面的例子中展示了如何利用不同的参数组合来进行方法重载: ```java class Example { // 无参方法 public void display() { System.out.println("No parameters"); } // 单个整型参数 public void display(int a) { System.out.println("Integer parameter: " + a); } // 字符串加整数作为参数 public void display(String s, int b) { System.out.println("String and Integer parameters: " + s + ", " + b); } } ``` 上述代码片段说明了即使是同样的`display()`名称下也可以通过改变输入参数的形式来区分各个版本的方法[^4]。 #### 返回值不影响重载判断 值得注意的是,尽管可以在定义时指定不同的返回值类型,但这并不足以让编译器识别为新的独立方法实例;也就是说,仅靠更改返回值得不到真正的重载效果。考虑如下尝试失败的情况: ```java // 错误示范:试图仅仅依靠修改返回值类型达到重载目的 public class BadExample { // 原始方法 public int addNumbers(int x, int y){ return x+y; } // 尝试只改返回值类型进行重载 (错误做法) public float addNumbers(int x, int y){ // 编译报错 return (float)(x+y)*1.5f; } } ``` 此案例中的第二次声明会引发编译期错误,因为对于编译器而言这并不是一个新的独特的方法签名[^5]。 综上所述,在Java编程语言里,当涉及到方法重载时,应该关注于调整实际传入该函数内部处理的数据形式即其参数表单的设计,而不是简单地变更输出结果的表现方式也就是返回值种类。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值