通常不鼓励在Java中的返回参数中使用通用通配符类型.例如,Effective Java,第28项规定:
不要将通配符类型用作返回类型.它不会为您的用户提供额外的灵活性,而是迫使他们在客户端代码中使用通配符类型.
正确使用的通配符类型对于类的用户几乎是不可见的.它们使方法接受它们应该接受的参数并拒绝它们应该拒绝的参数.如果类的用户必须考虑通配符类型,那么类的API可能有问题.
但在某些情况下,它似乎是最佳选择,例如在下面的代码中:
import java.util.*;
import java.lang.*;
import java.io.*;
class Container
{
private final Map<String, Type<?>> itemMap = new HashMap<>();
public <T> void addItem(String key, T t) {
itemMap.put(key, new Type<>(t));
}
public Collection<Type<?>> getAllItems() {
return itemMap.values();
}
public static class Type<T> {
private final T value;
public Type(T value) {
this.value = value;
}
@Override
public String toString() {
return "Type(" + value + ")";
}
}
public static void main (String[] args)
{ …Run Code Online (Sandbox Code Playgroud) 我在以下代码中遇到隐式转换问题:
trait A {
def send(s: String): String = {
println(s)
s
}
}
object X {
implicit def toB(a: A): B = new B(a)
class B(a: A) {
def <<(s: String): String = a send s
}
}
object Y {
implicit def toB(a: A): B = new B(a)
class B(a: A) {
}
}
object Test extends App {
import X._
import Y._
val a: A = new A {}
a << "Test"
}
Run Code Online (Sandbox Code Playgroud)
Test中的最后一个语句导致编译错误:
error: value << …Run Code Online (Sandbox Code Playgroud)