java 范型 隐式 显式_为什么Java中不允许使用类中的隐式泛型?

我试图理解为什么Java不允许在泛型类中使用隐式类型,就像在泛型方法中一样.

我已经在网上搜索了这个问题的答案,但是还没有找到一个原因,为什么Java中不支持以下内容:

// This will not compile:

public interface ElementPicker> { ... }

// This on the other hand will

public interface ElementPicker> { ... }

所以我们必须在类泛型参数中明确提到类型T.这当然意味着我们现在必须写:

ElementPicker>

// instead of just:

ElementPicker>

这导致我的代码中的头疼不断,我试图明智地平衡使用泛型,同时使我的类型可读和简短.

不幸的是,在我当前的项目中,我正在处理一堆嵌套的泛型类型,并且它们的类型参数冒泡到顶部,因此我有很长的顶级类,必须包含所有泛型类型数据.

要了解这可能会成为一个问题,请考虑:

interface ScalarValue {

T toNumber();

}

interface ScalarAdder> {

T add(U v1, U v2);

}

class ScalarAccumulator,

A extends ScalarAdder> {

...

}

// Assuming we have these implementations:

class RationalValue implements ScalarValue { .. }

class RationalAdder implements ScalarAdder { .. }

// A typical type could look like this monster:

ScalarAccumulator

// Whereas an implicit declaration like this:

public

U extends ScalarValue,

A extends ScalarAdder

class ScalarAccumulator { ... }

// ... would allow us to simply write

ScalarAccumulator

// ...as all other types can be inferred.

这也是一个例子,但我在工作中经常遇到这些事情.我还没有找到为什么这是不可能的原因.方法可以很好(从单个值及其类推断类型).

那么为什么Java可以在方法中支持,而不是在类中支持?我想不出一个例子,如果一个类没有明确地包含该类型将是一个问题.但我可能错过了一些东西.

如果有人在处理这些情况时有任何关于解决方法的好方法,我也会很感激.

解决方法:

在Java 10中,您可以使用var来跳过类型声明.这是一种(有点hacky)将它与类型推断相结合的方法,因此您可以在不声明所有嵌套类型的情况下创建实例:

static , A extends ScalarAdder> ScalarAccumulator create(Class adderClass) {

return new ScalarAccumulator<>();

}

static void test() {

var a = create(RationalAdder.class);

}

标签:java,generics

来源: https://codeday.me/bug/20190705/1387320.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值