0

私のコードは:

class ReferenceRangeBuilder<T extends DvOrderedBuilder> {

private DvTextBuilder meaningBuilder;
private DvIntervalBuilder<T> rangeBuilder;
   public ReferenceRangeBuilder() throws ClassNotFoundException, InstantiationException, IllegalAccessException {

}

}

rangeBuilder を開始して、値を設定できるようにします。コンストラクタ内でやりたい。DvIntervalBuilder rangeBuilder の場合、次のようにしました:

 public DvIntervalBuilder() throws NoSuchFieldException, InstantiationException, IllegalAccessException, ClassNotFoundException {
        ParameterizedType pt = (ParameterizedType) getClass().getGenericSuperclass();
        // You may need this split or not, use logging to check
        String parameterClassName = pt.getActualTypeArguments()[0].toString().split("\\s")[1];

        T lower = (T) Class.forName(parameterClassName).newInstance();
        T upper = (T) Class.forName(parameterClassName).newInstance();

    }
4

3 に答える 3

1

貴重な時間と意見をありがとう、このようなコンストラクタを書くことで私は自分で問題を解決しました。

私の解決策は次のとおりです。

public ReferenceRangeBuilder(Class<T> claz) {
    try {
        lowerReferenceRange = claz.newInstance();
        upperReferenceRange = claz.newInstance();
    } catch (InstantiationException ex) {
        Logger.getLogger(ReferenceRangeBuilder.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(ReferenceRangeBuilder.class.getName()).log(Level.SEVERE, null, ex);
    }
}
于 2012-12-12T10:17:33.817 に答える
0

Tコンストラクター内のインスタンスで作成できるかどうか尋ねていますか? この情報は、Java でジェネリックが実装されているため、実行時には利用できません。詳細については、「タイプ消去」を参照してください。http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

于 2012-12-06T13:54:00.730 に答える
0

このアプローチが機能するには、ビルダーをサブクラス化する必要があります。そうしないと、実行時に型が不明になります。

public class Main {
    static class Builder<T> {
        private final Class clazz;

        protected Builder() {
            Type type = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
            if (type instanceof Class)
                clazz = (Class) type;
            else
                throw new AssertionError("Builder needs to be sub-classed as " + type + " is unknown");
        }

        public Class<T> getClazz() {
            return clazz;
        }
    }

    public static void main(String... args) {
        // works fine as sub-class records that the type is BigDecimal.
        Builder<BigDecimal> bigDecimalBuilder = new Builder<BigDecimal>() {
        };
        System.out.println(bigDecimalBuilder.getClazz());
        // doesn't work.
        Builder<BigDecimal> bigDecimalBuilder2 = new Builder<BigDecimal>();
    }
}

版画

class java.math.BigDecimal

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    at Main$Builder.<init>(Main.java:21)
    at Main.main(Main.java:37)      
于 2012-12-06T13:54:43.593 に答える