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

时间:2016-05-19 16:09:52

标签: java

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

例如,如果我能够根据需要将值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);
        }
    }
}

3 个答案:

答案 0 :(得分:5)

  

如何根据输入参数使方法通用以接受返回类型?

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,等等。

答案 1 :(得分:-1)

public void insertData(ArrayList<SavedWifiHotspot> hotspots, ArrayList<MarkerOptions> markers) {
Log.d("insert LocationsDB", "Data inserted");

new AsyncTask<ArrayList<SavedWifiHotspot>, Void, Void>() {

        @Override
        protected Void doInBackground(ArrayList<SavedWifiHotspot>... hotspots) {
            ContentValues hotspotValues = new ContentValues();
            for(SavedWifiHotspot hotspot : hotspots[0]) {
                hotspotValues.put("Ssid", hotspot.getSsid());
                hotspotValues.put("Password", hotspot.getPassword());
                hotspotValues.put("LocationName", hotspot.getHotspotLoc());
                hotspotValues.put("Lat", hotspot.getLatitude());
                hotspotValues.put("Lng", hotspot.getLongitude());
                db.insert(HOTSPOT_TABLE_NAME, null, hotspotValues);
            }

        }
    }.execute(hotspots);

new AsyncTask<ArrayList<MarkerOptions>, Void, Void>() {

        @Override
        protected Void doInBackground(ArrayList<MarkerOptions>... options) {
            ContentValues hotspotValues = new ContentValues();
            for(MarkerOptions marker: options[0]) {
                markerValues.put("LocationName", marker.getTitle());
                markerValues.put("Lat", marker.getPosition().latitude);
                markerValues.put("Lng", marker.getPosition().longitude);
                db.insert(LOCATION_TABLE_NAME, null, markerValues);
            }

        }
    }.execute(options);
}


public void clearData() {
    Log.d("clear LocationsDB", "Tables cleared");
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            SQLiteDatabase db=this.getWritableDatabase();

           String dropHSTable = "DROP TABLE IF EXISTS "
               + HOTSPOT_TABLE_NAME + ";";

           String dropLocTable = "DROP TABLE IF EXISTS "
               + LOCATION_TABLE_NAME + ";";

           db.execSQL(dropHSTable);
           db.execSQL(dropLocTable);
           createTables(db);
        }
   }.execute();


}

答案 2 :(得分:-2)

由于java方法只能返回一个结果,所以你必须做一些解决方法。如您所知,您可以返回Object

如上所述:Return different type of data from a method in 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;
}