我已经看过几次提到这个,我不清楚这是什么意思.你何时以及为何会这样做?
我知道接口有什么作用,但事实上我不清楚这一点让我觉得我错过了正确使用它们.
如果你这样做是这样的:
IInterface classRef = new ObjectWhatever()
Run Code Online (Sandbox Code Playgroud)
你可以使用任何实现的类IInterface吗?你什么时候需要这样做?我唯一能想到的是,如果你有一个方法,你不确定除了实现之外将传递什么对象IInterface.我想不出你需要多久做一次.
另外,你怎么能写一个接受实现接口的对象的方法?那可能吗?
我在导航Java规则以推断泛型类型参数时遇到了一些麻烦.考虑以下类,它具有可选的list参数:
import java.util.Collections;
import java.util.List;
public class Person {
private String name;
private List<String> nicknames;
public Person(String name) {
this(name,Collections.emptyList());
}
public Person(String name,List<String> nicknames) {
this.name = name;
this.nicknames = nicknames;
}
}
Run Code Online (Sandbox Code Playgroud)
我的Java编译器给出以下错误:
Person.java:9: The constructor Person(String, List<Object>) is undefined
Run Code Online (Sandbox Code Playgroud)
但是Collections.emptyList()返回类型<T> List<T>,而不是List<Object>.添加演员表无济于事
public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}
Run Code Online (Sandbox Code Playgroud)
产量
Person.java:9: inconvertible types
Run Code Online (Sandbox Code Playgroud)
使用EMPTY_LIST而不是emptyList()
public Person(String name) {
this(name,Collections.EMPTY_LIST);
}
Run Code Online (Sandbox Code Playgroud)
产量
Person.java:9: warning: [unchecked] unchecked conversion
Run Code Online (Sandbox Code Playgroud)
而以下更改会使错误消失:
public Person(String name) …Run Code Online (Sandbox Code Playgroud) 我有我的Java方法如下;
public List<Lookup> findAll(String lang) {
Query query = entityManager.createNamedQuery("Lookup.findAll");
if (isValidLang(lang)) {
query.setParameter("lang", lang);
return query.getResultList();
} else {
//return empty list
}
}
Run Code Online (Sandbox Code Playgroud)
现在该方法返回List以获得有效的lang匹配.
但如果不是这样,我想返回一个空列表.我的问题是如何更新代码以及返回空列表的最佳方法是什么,以便代码不会失败?