Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型-Eclipse编译器发出警告,javac给出错误_Java - Fatal编程技术网

泛型-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);
}