参数化类型(如List)的Java类型推断
今天早上在编写代码时,我发现了一些奇怪的事情,我想解释一下为什么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
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(ListListList“在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]