Java泛型类,如何为可能的参数类型定义构造函数

Java泛型类,如何为可能的参数类型定义构造函数,java,generics,Java,Generics,我试图定义一个可以用于泛型类型的Java类,但我想为可能的参数类型(如Character)或可以手动定义的对象类型定义构造函数 我尝试创建的类称为: public class Repeated<T> implements Pict { private T[][] elements; private double scale; public Repeated(T[][] elems) { elements = elems; } } 因此,我想添加一个构造函数,它添加一个

我试图定义一个可以用于泛型类型的Java类,但我想为可能的参数类型(如Character)或可以手动定义的对象类型定义构造函数

我尝试创建的类称为:

public class Repeated<T> implements Pict {

private T[][] elements;

private double scale;

public Repeated(T[][] elems) {
    elements = elems;
}
}

因此,我想添加一个构造函数,它添加一个字符数组,并在只有T是字符类型时执行特定的操作。可能吗?或者我应该将其作为一个接口,然后在以后实现它吗?

您应该能够做到这一点:

public Repeated(T[][] elems) {
    elements = elems;
    boolean isCharacterArrayArray = false;
    if (elems != null) {
        for (T[] elt : elems) {
            if (elt != null && elt.length > 0) {
                isCharacterArrayArray = elt[0] instanceof Character;
                break;
            }
        }
    }
    if (isCharacterArrayArray) {
        // received a Character[][]
    }
}
但是,由于类型擦除,我认为您无法区分这些调用:

new Repeated((Character[][]) null);
new Repeated((Integer[][]) null);
没有传递某种显式的类参数

使用类参数进行编辑,一切都变得简单得多:

public Repeated(T[][] elems, Class<T> cls) {
    elements = elems;
    if (cls.equals(Character.class)) {
        // passed a Character[][]
    }
}

您应该能够做到这一点:

public Repeated(T[][] elems) {
    elements = elems;
    boolean isCharacterArrayArray = false;
    if (elems != null) {
        for (T[] elt : elems) {
            if (elt != null && elt.length > 0) {
                isCharacterArrayArray = elt[0] instanceof Character;
                break;
            }
        }
    }
    if (isCharacterArrayArray) {
        // received a Character[][]
    }
}
但是,由于类型擦除,我认为您无法区分这些调用:

new Repeated((Character[][]) null);
new Repeated((Integer[][]) null);
没有传递某种显式的类参数

使用类参数进行编辑,一切都变得简单得多:

public Repeated(T[][] elems, Class<T> cls) {
    elements = elems;
    if (cls.equals(Character.class)) {
        // passed a Character[][]
    }
}
所以我想添加一个构造函数,它添加一个字符数组 如果只有T是类型字符,则是特定的

听起来是多态性的好例子:

public class RepeatedChars extends Repeated<Character> {

    public RepeatedChars(Character[][] chars) {
        super(chars);
        //do special stuff
    }

    //other character-specific logic if applicable
}
您甚至可以将此类作为实现细节隐藏:

public class Repeated<T> implements Pict {

    ...

    private static class RepeatedChars extends Repeated<Character> {
        //see above
    }

    public static Repeated<Character> makeForChars(Character[][] chars) {
        return new RepeatedChars(chars);
    }
}
所以我想添加一个构造函数,它添加一个字符数组 如果只有T是类型字符,则是特定的

听起来是多态性的好例子:

public class RepeatedChars extends Repeated<Character> {

    public RepeatedChars(Character[][] chars) {
        super(chars);
        //do special stuff
    }

    //other character-specific logic if applicable
}
您甚至可以将此类作为实现细节隐藏:

public class Repeated<T> implements Pict {

    ...

    private static class RepeatedChars extends Repeated<Character> {
        //see above
    }

    public static Repeated<Character> makeForChars(Character[][] chars) {
        return new RepeatedChars(chars);
    }
}

使用构造函数是不可能的,但是如果您使用静态工厂方法,这很可能是可能的!由于类型擦除,这是不可能的。另外,记住这个原则——如果你真的需要泛型,我会看看@Paul Bellora所描述的内容,否则就不需要了。构造函数是不可能的,但是如果你使用静态工厂方法,这很可能是可能的!由于类型擦除,这是不可能的。另外,记住这个原则——如果你真的需要泛型,我会看看@Paul Bellora所描述的内容,否则就不考虑了。我对你的解决方案不感兴趣,但你可以使用它——这可以解释空数组。@PaulBellora-好主意。不过,它仍然不适用于空数组,因为那里没有可调用getClass的对象。我也不喜欢我的解决方案;不过,传递一个类对象可以解决所有问题。我对你的解决方案不感兴趣,但你可以使用-这可以解释空数组。@PaulBellora-好主意。不过,它仍然不适用于空数组,因为那里没有可调用getClass的对象。我也不喜欢我的解决方案;不过,传递一个类对象可以修复所有问题。如果要用工厂方法实现这一点,则不需要子类。只需定义一个最有可能的私有构造函数RepeatedT[][]元素,即布尔isCharsFlag。然后,工厂方法可以将适当的标志值传递给构造函数。只需定义一个最有可能的私有构造函数RepeatedT[][]元素,即布尔isCharsFlag。然后,工厂方法可以将适当的标志值传递给构造函数。