2

我正在尝试将我用 C# 编写的一些代码移植到 Java,但还不知道所有 Java 语法。我也不知道这种东西叫什么,所以很难搜索……我称之为“继承约束”。

基本上,是否有与此 C# 代码等效的 java:

public abstract class MyObj<T> where T : MyObj<T>, new()
{

}

谢谢。


编辑:

有没有办法做到这一点:

public abstract class MyObj<T extends MyObj<T>> {
    public abstract String GetName();

    public virtual void Test() {
          T t = new T();                // Somehow instantiate T to call GetName()?
          String name = t.GetName();
    }
}
4

2 回答 2

9

不完全的。有这个:

public abstract class MyObj<T extends MyObj<T>>

但没有等同于new()约束。

编辑:要创建 的实例T,您将需要适当的Class<T>- 否则类型擦除将字节您。

通常,您会将其添加为构造函数参数:

public MyObj(Class<T> clazz) {
    // This can throw all kinds of things, which you need to catch here or
    // propagate.
    T t = clazz.newInstance(); 
}
于 2012-11-19T18:24:52.757 回答
1

从您上面的评论来看,您正在寻找以下构造:

一个interface您将在代码中与 MyObj 对象交互的对象...您将调用 test() 方法(Java 中的标准样式是驼峰式方法,大写的类/接口)

public interface IMyObj {
    public void test();
}

您将需要抽象超类...对于您选择的示例,您不需要指定任何泛型,尽管如果实际实现更依赖于类型安全,您绝对可以...这个类应该实现IMyObj 界面:

public abstract class MyObj implements IMyObj {

    String name;

    public abstract String getName();

    public void test() {
        name = getName();
    }
}

从这里你可以将你的子类写到 MyObj...

public class MySubObj1 extends MyObj {
    public String getName() { return "MySubObj1"; }
}

public class MySubObj2 extends MyObj {
    public String getName() { return "MySubObj2"; }
}

然后,您可以在另一个类中安全且正确地使用以下代码段:

IMyObj obj = new MySubObj1();
obj.test();

关键是您使用接口来隐藏实现,并使用抽象类来保存子类将在其实现中使用的公共代码。

希望这可以帮助!

于 2012-11-20T13:48:44.000 回答