Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java方法能否根据方法中的条件返回不同的类型?_Java - Fatal编程技术网

Java方法能否根据方法中的条件返回不同的类型?

Java方法能否根据方法中的条件返回不同的类型?,java,Java,是否可以让一个方法根据条件返回不同的类型?我从未广泛地学习过Java,但我研究过泛型,如果对参数的依赖性不明显,它似乎不适用。基本上 public ????? func(Object obj) { if(obj instanceof class1) { return new Integer(1); } else if(obj instanceof class2) { return "asdf";

是否可以让一个方法根据条件返回不同的类型?我从未广泛地学习过Java,但我研究过泛型,如果对参数的依赖性不明显,它似乎不适用。基本上

public ????? func(Object obj)
{
    if(obj instanceof class1)
    {
        return new Integer(1);
    }
    else if(obj instanceof class2)
    {
        return "asdf";
    }
    else
    {
        return new Double(1.7);
    {
}

我可以保证,传入的任何参数和返回的任何内容都将始终是对象,如果这使事情变得更简单的话。感谢您的帮助

您可以将该方法声明为具有返回类型的对象,但仅此而已

像Java这样的强类型语言之所以如此优秀,一个重要原因是它们保证返回的对象类型是指定类型的实例,而不管代码有多复杂。如果调用该方法得到的结果可能是整数、字符串或Double,那么它们唯一的共同点就是它们都是对象。在大多数情况下,这没有多大用处。您可以检查调用方法中的返回类型,看看它是否是您要查找的类的实例,然后执行强制转换,但这不是面向对象编程的好用途

更好的方法是创建一个接口,说明从该方法返回的所有对象应该做什么,然后您可以返回实现该接口的不同类型的对象,或者扩展一些常见的超类

例如,假设您希望根据不同的条件返回不同的动物。你完全可以这样做,因为狗、猫和马都是动物。我建议避免像这样的instanceof检查,但仍然可以作为一个例子:

public Animal func(Object obj)
{
    if(obj instanceof class1)
    {
        return new Dog();
    }
    else if(obj instanceof class2)
    {
        return new Cat();
    }
    else
    {
        return new Horse();
    {
}

可以通过两种方式返回不同类型的对象

使用泛型方法

公共函数对象obj{ 类的ifobj实例 { 返回T个新整数1; } 类2的else ifobj实例 { 返回T asdf; } 其他的 { 返回T新的Double 1.7; } } 当您调用该方法时,这会给您一种类型安全的错觉

例如,int i=funcnewclass2;编译时没有警告,但在运行时会抛出ClassCastException,因为它试图将字符串转换为int

使用对象类

公共对象函数对象{ 类的ifobj实例 { 返回新的整数1; } 类2的else ifobj实例 { 返回asdf; } 其他的 { 返回新的Double1.7; } }
只需返回对象。这就是你正在做的。 当然,你可以使用

公共函数对象obj{ ... } 但这是毫无意义的。 因为当你使用这个方法时,你无法决定T应该是什么。因为它是在运行时决定的。 此代码仅在参数为T的泛型类中使用时有用

public interface CloneMe<T> {
   T cloneMe();
}

public class Bean implements CloneMe<Bean> {
   public Bean cloneMe() {
       return new Bean(this);
   }
}

在返回类型T中使用泛型,在传递param的地方使用泛型。只有当返回类型T与参数类型相同时,上述注释才有效,并且通常应该有一个具体的原因来解释为什么这样做,而不是OP问题的一般前提。泛型方法不适用于OP的用例。在OP的返回案例中,结果类型取决于参数的运行时类型。泛型类型是静态的。