java 参数类型转换_java – 如何从通配符类型转换为参数化类型?

假设有一个带有多个类型参数的框架类型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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值