2010-04-12 2 views
3

Java로 C# 코드를 포팅합니다. Syntax, 특히 new()에 문제가 있습니다. Java의 generic과 비슷한 점은 T가 FOO를 확장한다는 것을 이해합니다.C# to Java : T : new() 구문

Java에서 new() 인수를 어떻게 복제 할 수 있습니까?

"The new() Constraint lets the compiler know that any type argument supplied must have an accessible parameterless--or default-- constructor." - MSDN

예 : 제네릭은 C# 및 사이 근본적으로 다르기 때문에

public class BAR<T extends FOO> extends ABSTRACTBAR { 
    public BAR(T t) throws InstantiationException, IllegalAccessException{ 
     t.getClass().newInstance(); 
     this.value = t; 
    } 
} 

답변

7

당신은 자바에서 그것을 복제 할 수 없습니다 :

다음
public class BAR<T> : BAR 
     where T : FOO, new() 

내가 클리 터스의 솔루션을 구현하는 방법이다 자바. Java는 형식 소거를 사용하므로 런타임시 일반 형식 인수가 유지되지 않습니다. 당신이 당신의 제네릭 형식 인수의 요소를 구성 할 경우, 당신은 클래스 인스턴스를 전달해야합니다 :

public class Bar<T extends Foo> { 
    private final Class<T> clazz; 

    public class Bar(Class<T> clazz) { 
    this.clazz = clazz; 
    } 

    public T newInstance() { 
    return clazz.newInstance(); // this will throw checked exceptions 
    } 
} 

편집 : 그냥 제네릭 형식 인수의 런타임 타입 안전의 문제를 다루 : 분명히 자바 기본적으로에는 유형 삭제로 인해이 형식이 없습니다. 제네릭 형식 인수에 대한 런타임 유형이 없습니다. 그러나 해결책이 있습니다. 당신은 Collections.checkedList()를 사용 : 당신이 String하지 무언가를 삽입하려고하면

List<String> list = Collections.checkedList(new ArrayList<String>(), 
         String.class); 

이 컬렉션은 이제 예외가 발생합니다.

+0

+1 시간이 초과되면 받아 들일 것입니다. –

+2

나는 분명히 downvote를하지 않았지만 이것이 generics로 Java에서 할 수있는 최선의 방법이지만 런타임 유형 안전은 없다. 전달되는 유형이 인터페이스 자체가 아니거나 공용 기본 생성자가없는 것으로 중지되지 않습니다. – Yishai

0

수 없습니다. Java는 지우는 제네릭 형식 안전을 구현하고 생성자의 서명을 기반으로 한 입력을 지원하지 않으므로 정확하게 수행하고 정적 유형 검사를 수행 할 방법이 없습니다.

0

희망이 도움이됩니다. 새로운 인스턴스를 생성 할 때는 인수가없는 생성자가 필요합니다.

 

public class TypeStuff { 

    private static final long serialVersionUID = 1L; 

    // *** PUBLIC STATIC VOID MAIN *** 
    public static void main(String[] args) { 
     TypeStuff ts = new TypeStuff(); 
     ts.run(); 
    } 

    // *** CONSTRUCTOR *** 
    public TypeStuff() { 
    } 

    public void run() { 
     Fruit banana = new Banana(); 

     Fruit dupe = newT(banana); 
     System.out.println("dupe.getColor()=" + dupe.getColor()); 

     Fruit orange = new Orange(); 
     Fruit dupe2 = newT(orange); 
     System.out.println("dupe2.getColor()=" + dupe2.getColor()); 
    } 

    public <T extends Fruit> T newT(T fruit) { 
     T dupe = null; 
     try { 
      Class clazz = fruit.getClass(); 
      dupe = (T) clazz.newInstance(); 
     } catch (Exception ex) { 
     } finally { 
      return dupe; 
     } 
    } 

    interface Fruit { 
     String getColor(); 
    } 
    static class Banana implements Fruit { 
     public Banana() { 
     } 
     @Override 
     public String getColor() { 
      return "Yellow"; 
     } 
    } 
    static class Orange implements Fruit { 
     public Orange() { 
     } 
     @Override 
     public String getColor() { 
      return "Orange"; 
     } 
    } 


} // CLOSE CLASS.