标签: multiple-bounds

Java编译器如何为具有多个边界的参数化类型选择运行时类型?

我想更好地理解当Java编译器遇到如下方法的调用时会发生什么.

<T extends AutoCloseable & Cloneable>
void printType(T... args) {
    System.out.println(args.getClass().getComponentType().getSimpleName());
}

// printType() prints "AutoCloseable"
Run Code Online (Sandbox Code Playgroud)

我很清楚,<T extends AutoCloseable & Cloneable>在运行时没有类型,因此编译器可以做出最少的错误,并创建一个类型为两个边界接口之一的数组,丢弃另一个.

无论如何,如果切换接口的顺序,结果仍然是相同的.

<T extends Cloneable & AutoCloseable>
void printType(T... args) {
    System.out.println(args.getClass().getComponentType().getSimpleName());
}

// printType() prints "AutoCloseable"
Run Code Online (Sandbox Code Playgroud)

这导致我做了一些调查,看看接口发生变化时会发生什么.在我看来,编译器使用某种严格的顺序规则来决定哪个接口是最重要的,并且接口在代码中出现的顺序不起作用.

<T extends AutoCloseable & Runnable>                             // "AutoCloseable"
Run Code Online (Sandbox Code Playgroud)
<T extends Runnable & AutoCloseable>                             // "AutoCloseable"
Run Code Online (Sandbox Code Playgroud)
<T extends AutoCloseable & Serializable>                         // "Serializable"
Run Code Online (Sandbox Code Playgroud)
<T extends Serializable & AutoCloseable>                         // "Serializable"
Run Code Online (Sandbox Code Playgroud)
<T extends SafeVarargs & Serializable>                           // "SafeVarargs"
Run Code Online (Sandbox Code Playgroud)
<T extends Serializable …
Run Code Online (Sandbox Code Playgroud)

java variadic-functions jls multiple-bounds

25
推荐指数
1
解决办法
464
查看次数

何时使用或如何在泛型中使用多重绑定

我是泛型新手,并且从听说 https://docs.oracle.com/javase/tutorial/java/generics/bounded.html学习泛型

我正在学习多重界限,我的理解是你可以指定类如下

class D <T extends A & B & C> { /* ... */ }
D<A> d = new D<>();
Run Code Online (Sandbox Code Playgroud)

仅当 A 实现 B 和 C 时才会发生编译时错误,B 和 C 也应该是接口,否则会发生编译时错误

我不是在谈论通配符

我的问题是我没有得到任何真正的编程用途。我正在寻找一种方法/示例,如何在编码时使用多个绑定泛型。

我应该什么时候使用它?

谢谢

java generics multiple-bounds

5
推荐指数
1
解决办法
1083
查看次数