2011-11-12 2 views
1

지금 제네릭을 연구 중이며 나를 위해 데이터를 저장할 수있는 매개 변수화 된 클래스를 작성하는 방법을 궁금해합니다. 나에 대한 C++의 영향으로 알고 싶다. 둘째, 어떻게 ArrayList가 만들어 졌는지 궁금합니다.내 자신의 사용자 정의 컨테이너를 만드는 방법 - 기본 생성자 없음

제 문제는 기본 생성자가없는 클래스의 새 인스턴스 (Integer)를 만들 수 없다는 것입니다. 저는이 수업들을 개별적으로 다루기 위해서 제가 수업을 전문화해야한다는 것을 압니다. 그러나 Java에는 C++와 같은 특수화가 없습니다.

어떻게 대신 시험의 정수를 처리하는

import java.lang.*; 

class test {} 

class generic<T> { 
    private Class<T> type; 
    T element; 
    generic(Class<T> type) { 
    this.type = type; 
    try { 
     element = type.newInstance(); 
    } catch (Exception e) { 
     System.out.println("error " + e); 
    } 
    } 
    static <T> generic<T> create(Class<T> type) { 
    return new generic<T>(type); 
    } 
} 

public class Generic { 
    public static void main(String[] args) { 
    generic<Test> test = generic.create(Test.class); 
    System.out.println(test); 
    } 
} 

그래서 코드를 변경할 수 있습니까?

+1

ArrayList의 작동 방식을 알고 싶다면 소스를 읽으시겠습니까? 또한 컨테이너가 생성 할 새로운 유형의 인스턴스를 생성해야하는 이유는 무엇입니까? 그것은 더 이상 "컨테이너"처럼 보이지 않습니다. –

+1

클래스 이름은'Test'와 같이'UpperCamelCase'가되어야하고 Java 표준 관습을 따르려면'Generic'이어야합니다. –

답변

1

내 반응과 같이 보입니다 생각합니다. 데이터를 작성하고 데이터를 저장하십시오. Integer 클래스에 대한 경험을 통해 알게 되듯 Java에서 기본 생성자가 아니라 공용 생성자를 노출시키지 않는 많은 클래스가 있습니다. 따라서 발생할 수있는 모든 유형에 의존 할 수있는 객체 인스턴스를 만드는 단일 방법이 없습니다. 당신은 너무의 작성 데이터의 책임을 제거 할 수 귀하의 요구 사항은 데이터를 저장하는 것입니다 상태 : 당신은 모든 SDK 유형은 어떻게 검사 자유롭게 이용할 수 있도록 구축하는 방법을 ArrayList 궁금 대해서는

class Test { 
    public String toString() { 
     return "test"; 
    } 
} 

class Generic<T> { 
    private T element; 

    Generic(T element) { 
     this.element = element; 
    } 

    public String toString() { 
     return element.toString(); 
    } 
} 

public class GenericTest { 
    public static void main(String[] args) { 
     Generic<Test> testGeneric = new Generic<Test>(new Test()); 
     System.out.println(testGeneric); 

     Generic<Integer> integerGeneric = new Generic<Integer>(3); 
     System.out.println(integerGeneric); 
    } 
} 

을, 자바는 오픈 소스 구현.

+0

자바가 오픈 소스인지 전혀 모르겠다. 그렇지 않으면 나는 결코 질문하지 않을 것이다. 이제는 누군가 제네릭에 많은 노력을 기울일 때 ArrayList를 구현하는 데 사용한다고 믿었 기 때문에 크게 실망했습니다. 실제로 그들은 단지 경고를 억제했습니다 ... –

+0

+1 @ lord.didger : Java generics를 사용하면 컴파일러는 컴파일 타임에 컴파일러가 생성 한 캐스트가 런타임에 실패하지 않을 것임을 컴파일러에서 확인할 수 있습니다. 또한'@ Override' 주석 사용을 고려하십시오. – trashgod

1

나는 그것이이 일을하려고하는 수업이

class MyArrayList<T> { 
    static final int defaultSize = 10; 
    Object[] array; 
    int index; 

    public MyArrayList() { 
     array = new Object[defaultSize]; 
     index = 0; 
    } 

    public void add(T e) { 
     if(index >= array.length) { 
      Object[] temp = new Object[array.length*2]; 
      for(int i=0; i<array.length; i++) { 
       temp[i]=array[i]; 
      } 
      array = temp; 
     } 
     array[index++] = e; 
    } 

    public T get(int i) { 
     return (T)array[i]; 
    } 
} 
+0

솔루션에는 일부 작업이 안전하지 않다는 경고가 발행되는 문제가 있습니다. 나는 T로 캐스팅하는 것에 관심이 있다고 생각합니다. 자바가 어떻게 적절하게 쓰여지는지보고 싶습니다. –

+0

BTW. 내가 당신의 클래스에서 프리미티브를 매개 변수로 사용할 수 없다는 것이 나에게 이상한 것처럼 보인다. –

+0

'@SuppressWarnings ("Unchecked")로 경고를 피할 수 있습니다. 제네릭에서는 원시를 사용할 수 없습니다. 이것은 Java에서 generics가 구문 설탕이기 때문입니다. 반면 C++에서는 템플릿에서 새 클래스가 생성됩니다. –

1

Integer 기본 생성자가없는 것은 제네릭과 관련이 없으며 모든 것이 변경 불가능한 클래스라는 사실과 관련이 있습니다.

관련 문제