2010-10-24 6 views
1

У меня есть класс, как следующее:Generic проблемы статического метода завода

public class Tree<T extends Comparable<? super T>> { 
    // private data omitted 
    private Tree() {} // non parametric private constructor, not exposed 
    // static factory method 
    public static <T extends Comparable<? super T>> Tree<T> newInstance() { 
    return new Tree<T>(); 
    } 
} 

Теперь из другого класса я пытаюсь это:

public class TestClass { 
    public void test() { 
    Tree<Integer> tree = Tree.newInstance(); // fail 
    } 
} 

, но когда я использую открытый конструктор, следующий код работает просто отлично

public void test() { 
    Tree<Integer> tree = new Tree<Integer>(); 
} 

Что я мог сделать неправильно?

Вот сообщение об ошибке:

Incompatibile types: 
required: structures.trees.Tree<java.lang.Integer> 
found: <T>structures.trees.Tree<T> 

Теперь странность: Вы можете попробовать это для себя. Этот код действительно работает с моим Eclipse 3.6 Helios, но это не с моим NetBeans 6.9.1. Я не могу поверить, что это проблема IDE (я даже использую JDK для обоих) ... Идеи? : O

+1

Дубликат [Дженерики компилируется и работает в Eclipse, но не компилируется в JAVAC] (http://stackoverflow.com/questions/2858799/generics-compiles- и спуски-в-затмения но-оленья кожа компиляция в-компилятор). Это [ошибка] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6468354) в javac. – BalusC

+1

Кстати, вы забыли 'static' в методе' newInstance() '. – BalusC

+0

Не можете ли вы просто написать метод как public public Tree newInstance() 'и он будет автоматически заполнять' T' из объявления класса? – MatrixFrog

ответ

2

Комментарий BalusC - ошибка javac.

решаемые явной типизации:

Tree<Integer> tree = Tree.<Integer>newInstance(); 
Смежные вопросы