gpt4 book ai didi

java - @SafeVarargs 接口(interface)方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:09:44 25 4
gpt4 key购买 nike

在这段代码中,

package com.example;

interface CollectorIF<T> {
// @SafeVarargs // Error: @SafeVarargs annotation cannot be applied to non-final instance method addAll
void addAll(T... values);
}

class Collector<T> implements CollectorIF<T> {

@SafeVarargs
public final void addAll(T... values) {
}
}

class Component<T> {

public void compute(T value) {
Collector<T> col1 = new Collector<>();
col1.addAll(value); // No warning

CollectorIF<T> col2 = new Collector<>();
col2.addAll(value); // Type safety: A generic array of T is created for a varargs parameter
}
}

Type safety: A generic array of T is created for a varargs parameter使用 Collector<T> 时不会出现警告引用,由于 @SafeVarargs注释。

但是,当通过 CollectorIF<T> 访问该方法时,警告确实发生了界面。关于接口(interface)方法,@SafeVarargs无效(这是显而易见的,因为编译器无法对方法主体中参数的使用执行任何检查)。

通过接口(interface)访问方法时如何避免警告?

最佳答案

无法避免此警告,因为无法安全地定义具有通用可变参数方法的接口(interface)。

CollectiorIF 的另一个实现可能会滥用参数,呈现 CollectorIF.addAll() 的任何调用者容易受到奇怪的运行时行为的影响。你可以证明接口(interface)和非 final方法应该允许@SafeVarargs (并要求对实现/覆盖方法进行类似注释),但目前 Java 开发人员有意识地决定不支持该模式。

JLS 提供了更多的背景知识:

The annotation is not usable where method overriding occurs. Annotation inheritance only works on classes (not methods, interfaces, or constructors), so an @SafeVarargs-style annotation cannot be passed through instance methods in classes or through interfaces.

~JLS §9.6.4.7

与此同时,您有两个选择;忽略警告或重构您的 API。

重构您的 API 实际上可能正是您想要的,因为通用可变参数方法只应用作通向真正的、适当通用实现的桥梁。与其将其定义为接口(interface)的一部分(因此要求所有实现都实现它),不如将其作为静态实用方法提供,从而使接口(interface)的 API 更小,同时仍然为调用者提供使用可变参数的灵 active 。从 Java 8 开始,实用程序方法甚至可以在接口(interface)中定义。

@SafeVarargs
public static <T> void addAll(CollectorIF<T> collector, T... values) {
collector.addAll(Arrays.asList(values));
}

然后你的接口(interface)应该定义一个addAll(Iterable<T> values)让实现者完全避免通用可变参数的复杂世界的方法。

关于java - @SafeVarargs 接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37829160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com