我正在尝试创建一个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);
}
}
}
答案 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.class
,double.class
,等。您必须改为使用Integer.class
,Double.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;
}