我想更好地理解当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) 我是泛型新手,并且从听说 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 也应该是接口,否则会发生编译时错误
我不是在谈论通配符
我的问题是我没有得到任何真正的编程用途。我正在寻找一种方法/示例,如何在编码时使用多个绑定泛型。
我应该什么时候使用它?
谢谢