假设有一个带有多个类型参数的框架类型Row,以及一个与Row类型的实例一起使用并使用所有这些类型参数的方法.
我有一个方法适用于任何类型的Row,甚至同时使用不同的类型,所以很明显我使用的是通配符类型Row.问题是,我如何调用一个行< R,K>的方法?一行?
我的思路:我不知道Row的类型.是的,但肯定是某种行好吧.并且当通用方法采用Row< R,K>时.这意味着它想要用R和K做一些事情,否则它可以处理任何类型的Row.所以我的“任何”类型应该使用一个采用“任何”类型的方法,对吧?
我在下面附上我尝试过的示例代码.最奇怪的是,最后一行确实有效,但它并不比我认为的任何其他类型更安全.所以基本上我想要一个更清洁的解决方案,如果可能的话,或者解释为什么这是要走的路.
package foo;
public class Experiment {
// Defined by a framework.
interface Key> {}
interface Row, K extends Key> {}
static , K extends Key> R copyRow(R row) {
return row;
}
// My experiments below.
static class Wrapper, K extends Key> {
public final R row = null; // fixme
public final Class clazz = null; // fixme
}
static , K extends Key> R upcast(Row, ?> row) {
return (R) row;
}
static , K extends Key> R upcast(Row, ?> row, Class clazz) {
assert row.getClass().equals(clazz);
return (R) row;
}
public static void main(String[] args) {
Wrapper, ?> wr = null; // fixme
copyRow(wr.row); // Compilation error
copyRow(upcast(wr.row)); // Compilation error
copyRow(upcast(wr.row, wr.clazz)); // This works, why?
}
}
(您可以将此示例直接发送到javac以查看会发生什么.使用Java 1.8:https://pastebin.com/LB10ySsD)