参数化类型(如List)的Java类型推断

参数化类型(如List)的Java类型推断,java,Java,今天早上在编写代码时,我发现了一些奇怪的事情,我想解释一下为什么java会这样做。 这里有一个片段解释了我在做什么: public class Test{ static int method(List<CharSequence> a) { //nothing important here } public static void main(String[] args) { List<String> myList = Arrays.asLis

今天早上在编写代码时,我发现了一些奇怪的事情,我想解释一下为什么java会这样做。 这里有一个片段解释了我在做什么:

public class Test{

  static int method(List<CharSequence> a) {
    //nothing important here
  }

  public static void main(String[] args) {
    List<String> myList = Arrays.asList("abc", "def");
    //this won't compile since it expect a list of CharSequence
    method(myList);
  }

}
公共类测试{
静态int方法(列表a){
//这里没什么重要的
}
公共静态void main(字符串[]args){
List myList=Arrays.asList(“abc”、“def”);
//这不会编译,因为它需要一个CharSequence列表
方法(myList);
}
}
我本来希望编译它,因为字符串实现了CharSequence。 我知道我可以更改方法的签名,以便:

static int method(List<? extends CharSequence> a)

static int method(List
List
List“在Java中,是否可以强制列表中的对象类型严格为CharSequence?”
CharSequence
是一个接口;您不能有一个“严格”的对象一个
CharSequence
而不是它的某些子类型。您正在寻找
List myList=Arrays.asList(“abc”、“def”)吗;
?@Sweeper是的,我可以用这种方式来声明我的列表。我只是想让我的示例尽可能简单。我只是想解释一下为什么java禁止做我写的事情。你可能想阅读另一个答案。这是一个古老、流行且重复性很强的问题。
StringBuilder
是一个
字符序列nce
,当您调用
a.add(new StringBuilder())
时,您希望发生什么?“在Java中,这是一种能够强制列表中的对象类型严格为CharSequence的方法吗?”
CharSequence
是一个接口;您不能有一个“严格”的对象一个
CharSequence
而不是它的某些子类型。您正在寻找
List myList=Arrays.asList(“abc”、“def”)吗;
?@Sweeper是的,我可以用这种方式来声明我的列表。我只是想让我的示例尽可能简单。我只是想解释一下为什么java禁止做我写的事情。你可能想阅读另一个答案。这是一个古老、流行且重复性很强的问题。
StringBuilder
是一个
字符序列nce
,调用
a.add(新的StringBuilder())时,您希望发生什么
myList
不是不可变的:元素可以设置,但不能添加或删除。感谢@OlivierGrégoire指出这一点。我用这张便条更新了我的答案。
myList
不是不可变的:元素可以设置,但不能添加或删除。感谢@OlivierGrégoire指出这一点。我用这张便条更新了我的答案.
import java.util.Arrays;
import java.util.List;

public class Main {
    static int method(List<String> a) {
        a.remove(0);// will throw UnsupportedOperationException at runtime
        a.add("Hello");// will throw UnsupportedOperationException at runtime
        a.set(0, "Hello");// works fine
        return 0;
    }

    public static void main(String[] args) {
        List<String> myList = Arrays.asList("abc", "def");
        method(myList);
        System.out.println(myList);
    }
}
import java.util.ArrayList;
import java.util.List;

public class Main {
    static int method(List<String> a) {
        a.remove(1);
        a.add("World");
        a.set(0, "Hello");
        return 0;
    }

    public static void main(String[] args) {
        List<String> myList = new ArrayList<String>() {
            {
                add("abc");
                add("def");
            }
        };
        // Instead of initializing myList as done above, you can do it as
        // List<String> myList = new ArrayList<>();myList.add("abc");myList.add("def");
        method(myList);
        System.out.println(myList);
    }
}
[Hello, World]