繁体   English   中英

Java中的通用参数类型和返回类型

[英]Generic Parameter Type and Return Type in Java

我正在尝试创建一个Java方法,该方法接受一个对象类型以及应将其转换为的数据类型。

例如,如果我应该能够根据需要返回值1作为Int或Double。 我正在使用Class传递数据类型作为参数。

问题:如何使方法泛型以接受基于输入参数的返回类型?

下面的代码仅是示例,在语法上可能是错误的,并被提供来解释我的问题。

public class JavaTest {

    public static void main(String[] args) {
        getValue(1,int.class);
        getValue(1,double.class);
        getValue("adf",String.class);
    }

    public static <E> void getValue(Object obj,Class<?> type) {
        if (type == String.class) { 
            // return string value
        }else if (type == int.class) { 
            //return Integer.parseInt(obj);
        }else if (type == double.class) { 
            //return Double.parseDouble(obj);
        }
    }
}

如何使方法泛型以接受基于输入参数的返回类型?

type参数可用于指定方法的返回类型,并且可以通过该参数的type参数将其与Class参数关联:

public static <E> E getValue(Object obj, Class<E> type) {

您还需要使用Class.cast()来使编译器满意该方法返回正确的类型。 (您也可以使用普通的强制类型转换,但是会受到类型安全警告的约束。)例如:

    // ...
    } else if (type == Integer.class) { 
        return type.cast(Integer.valueOf(obj.toString()));
    }

还要注意,您不能以这种方式直接实现到原始类型的转换,因为您的代码建议您尝试这样做。 您必须改为转换为其包装器类。 换句话说,您不能使用int.classdouble.class 您必须改为使用Integer.classDouble.class等。

 public static void main(String[] args) {
       int i=  (int) getValue(10,int.class);
       System.out.println("int value -->"+i);
      Double d = (Double) getValue(25.023,double.class);
      System.out.println("double d-->"+d);

        String s=(String) getValue("adf",String.class);
        System.out.println("String s-->"+s);
    }

    public static   <T> Object getValue(Object obj,Class<?> type) {
       return obj;

    }

由于java方法只能返回一个结果,因此您必须做一些工作。 如您所知,您可以返回Object

如此处所述: 从Java中的方法返回不同类型的数据? 您可以使用两个具有不同类型的私有值来编写您的类,以便稍后询问设置了哪一个!

因此,将其应用于您的问题,您可以编写如下内容:

public class ReturningValues {
public final double y;
public final int x;

public ReturningValues(double y, int x) {
    this.y = y;
    this.x = x;
}
}

然后使用此类作为方法的返回值:

public static ReturnValues myMethod(){
    ReturningValues rv = new ReturningValues(null,1);
    return rv;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM