泛型-Eclipse编译器发出警告,javac给出错误
假设我在应用程序中有以下类: 基类:泛型-Eclipse编译器发出警告,javac给出错误,java,Java,假设我在应用程序中有以下类: 基类: public abstract class Animal {} 子类 public class Dog extends Animal { public void bark() { System.out.println("woof"); } } 来自第三方库的类: public class ThirdPartyLibrary /* *cough* Hibernate *cough* */{ public List find() { ret
public abstract class Animal {}
子类
public class Dog extends Animal {
public void bark() {
System.out.println("woof");
}
}
来自第三方库的类:
public class ThirdPartyLibrary /* *cough* Hibernate *cough* */{
public List find() {
return new ArrayList() {
// fetched from the db in the actual app of course
{
add(new Dog());
add(new Dog());
add(new Dog());
}
};
}
}
和一个实用程序类:
public class Util {
public <E extends Animal> E findUnique(List<E> animals) {
return animals.isEmpty() ? null : animals.get(0);
}
/**
* @param args
*/
public static void main(String[] args) {
Dog d = new Util().findUnique(new ThirdPartyLibrary().find());
d.bark();
}
}
除了在调用findUnique之前显式转换到
(List)
,我还可以做些什么来让这段代码在javac中编译吗?不,您没有其他方法可以做,而且您必须在Eclipse中进行一些可疑的操作,因为Eclipse也无法编译它(作为Java代码)。由于传递给findUnique()的列表是原始类型,编译器无法确定E
中的public E findUnique(列表动物)
应该是什么。因此,E
本质上变成了?
,而您试图做的基本上是:
List<? extends Animal> l = new ArrayList<Animal>();
Dog dog = l.get(0);
对于
javac
问题,您是否使用与Eclipse安装相同版本的JDK进行编译?对于警告,您是否在Eclipse中的Java首选项下的错误和警告下进行了检查,以查看是否可以关闭该警告?是的,两者都使用1.6版。我真的不担心这些警告,因为我在方法之前有@SuppressWarnings(“unchecked”)。在eclipse中编译并使用sun java运行时,代码也运行良好。您是否尝试过:Dog d=(Dog)new Util().findUnique(new ThirdPartyLibrary().find())代码>显然,返回类型不兼容,您可能返回的不是狗。@blackcompe是的,也可以编译。谢谢您的解释,我知道现在发生了什么。也许这是一个应该报告的eclipse错误?我在Ubuntu上使用Indigo Service Release 1,jdt版本为3.6.1.v20110803_r371显然这是Eclipse中已知的错误。请参阅错误报告和。还有一个问题与此问题相关,另一个问题与方法重载有关。
List<? extends Animal> l = new ArrayList<Animal>();
Dog dog = l.get(0);
public <E extends Animal> E findUnique(List animals, Class<E> type) {
return animals.isEmpty() ? null : (E) animals.get(0);
}