【问题标题】:Java Generic Classes, how to define constructor for possible Parameter typesJava Generic Classes,如何为可能的参数类型定义构造函数
【发布时间】:2012-11-13 00:42:24
【问题描述】:

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

我尝试创建的类被称为:

public class Repeated<T> implements Pict {

private T[][] elements;

private double scale;

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

所以我想添加一个构造函数,它添加一个字符数组并在只有 T 是类型字符时做一些特定的事情。可能吗?或者我应该把它变成一个接口,然后再实现它?

【问题讨论】:

  • 使用构造函数是不可能的,但是如果你使用静态工厂方法来代替它可能是可能的!
  • 由于类型擦除,这是不可能的。另外,请记住 KISS 原则 - 如果您真的需要泛型,我会查看 @Paul Bellora 所描述的内容,否则请忽略它。

标签: java generics


【解决方案1】:

所以我想添加一个构造函数来添加一个字符数组并执行 如果只有 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);
    }
}

【讨论】:

  • 如果你打算用工厂方法来做这个,你不需要子类。只需定义一个(很可能是私有的)构造函数Repeated(T[][] elems, boolean isCharsFlag)。然后工厂方法可以将适当的标志值传递给构造函数。
【解决方案2】:

你应该可以这样做:

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[][]
    }
}

【讨论】:

  • 我对您的解决方案并不感兴趣,但您可以使用 Class.getComponentType() - 这将解释空数组。
  • @PaulBellora - 好主意。但是,它仍然不适用于null 数组,因为那里没有对象可以调用getClass()。我也不喜欢我的解决方案;不过,传递 Class 对象可以解决所有问题。
猜你喜欢
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
相关资源
最近更新 更多