小编elk*_*elk的帖子

在返回参数中使用通用通配符类型

通常不鼓励在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)

java generics bounded-wildcard

7
推荐指数
1
解决办法
3739
查看次数

Scala隐式转换问题

我在以下代码中遇到隐式转换问题:

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)

scala implicit-conversion

6
推荐指数
1
解决办法
270
查看次数