【发布时间】:2021-12-02 12:27:55
【问题描述】:
这个问题更具理论性(我想做的更复杂,但这是我坚持的部分),所以为这个人为的例子道歉,这可能没有多大意义。
假设我有一些类具有以不同形式返回其值的方法:
public class MyObject {
public String getAsString() {...}
public int getAsInt() {...}
// and so on
}
我正在尝试创建一个方法,以允许我通过其参数指定要调用的 MyObject 方法。比如:
public <T> T getValue(MyObject obj, Class<T> c) {
if (c == String.class) {
return obj.getAsString();
} else if (c == Integer.class) {
return obj.getAsInt();
} // and so on
}
那么我想这样调用这个方法,假设 obj 是一个 MyObject:
String s = getValue(obj, String.class);
int i = getValue(obj, Integer.class);
// and so on
我在 getValue 方法中收到编译错误“类型不匹配:无法从字符串转换为 T”(对于整数也是如此)。显然我只是没有完全理解泛型,但我认为这是泛型背后的一般思想——在这里我通过参数 c 指定(或至少试图指定)T 的真实类型。我做错了什么?
【问题讨论】:
-
试试
return c.cast(obj.getAsString()),对你有用吗 -
你在
getAsString和getAsInt做什么?转换价值观?或者您只是将Object-typed 值转换为方法返回类型? -
@ernest_k - 与我遇到的错误有关吗?这是一个非常人为的示例,旨在真正只关注泛型类型和我遇到的错误(抱歉),所以我们假设 getAsString 返回“hello”而 getAsInt 返回 42。
-
@ProGu 是的!至少编译。为什么?
-
@Jer 我正要发布一个答案,假设您的 API 合同假设调用者知道他们获得的值的数据类型。如果您不转换值,则可以完全避免所有这些转换。从这个意义上说,无论您是在转换还是只是在铸造很重要。
getValue()API 相当容易简化。