gpt4 book ai didi

java - 为什么这个类即使没有正确实现它的接口(interface)也能编译?

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:36 25 4
gpt4 key购买 nike

a List then 为什么代码(下面)可以编译?一定MyClass2应该返回 List<Integer>

public class Main {
public static void main(final String[] args) {
MyClass myClass = new MyClass();
List list = myClass.getList();
System.out.println(list);
System.out.println(list.get(0).getClass());

MyClass2 myClass2 = new MyClass2();
List list2 = myClass2.getList();
System.out.println(list2);
System.out.println(list2.get(0).getClass());
}

public interface Int1 {
public List getList();
}

public interface Int2 extends Int1 {
@Override
public List<Integer> getList();
}

public static class MyClass implements Int2 {
@Override
public List<Integer> getList() {
return Arrays.asList(1, 2, 3);
}
}

public static class MyClass2 implements Int2 {
@Override
public List getList() {
return Arrays.asList("One", "Two", "Three");
}
}
}

我注意到如果你试图让它成为 List<String>然后你会得到一个错误“java:Main.MyClass2 不是抽象的并且不会覆盖 Main.Int2 中的抽象方法 getList()”。我不太明白为什么你在上面的例子中没有得到这个。

注意:我项目中问题的解决方案是使接口(interface)本身通用,即Int1<X> (当然我用的名字比这更好,这只是一个例子)。

最佳答案

我怀疑,编译器应该针对未经检查的转换 向您发出警告,而不是将其标记为编译器错误。让我们了解为什么它会警告您:

您有以下两种方法可以实现以满足您实现的接口(interface)的约定:

public List getList();
public List<Integer> getList();

现在,如果在您的类中,您只需提供第一个方法的实现,它就可以处理对第二个nd 方法的请求。您可以返回 List<Integer>返回类型为 List .那是因为 List<Integer>只不过是一个 List在运行时,由于类型删除

但是,如果您只给出第 2 个nd 方法的实现,它将不满足第一个方法的约定。第一个方法说,它可以返回任何类型的 List ,因为它在返回类型中使用了原始类型。所以,它可以返回 List<Integer> , List<Object> , List<String> , 任何事物。但是 2nd 方法只能返回 List<Integer> .

编译器会在编译时做这种类型检查,它会给你警告,List需要未经检查的转换为 List<Integer> ,因为由于类型删除,转换无论如何都会在运行时成功。


这是类似下面的情况:

List<String> listString = new ArrayList<String>();
List rawList = new ArrayList();

listString = rawList; // Warning: Unchecked conversion
rawList = listString;

推荐读物:

关于java - 为什么这个类即使没有正确实现它的接口(interface)也能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17718184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com