如何创建一个类似于C++模板类的Java类?

20
我该如何用Java编写类似的代码?
// C++ Code

template< class T >
class SomeClass
{
private:
  T data;

public:
  SomeClass()
  {
  }
  void set(T data_)
  {
    data = data_;
  }
};

1
请注意,尽管您提供的代码可以转换为Java,但通常情况下,Java泛型仅具有C++模板的功能子集(您无法进行特化,没有SFINAE等)。 - David Rodríguez - dribeas
4个回答

39
class SomeClass<T> {
  private T data;

  public SomeClass() {
  }

  public void set(T data_) {
    data = data_;
  }
}

你也可能希望将类本身声明为public,但那几乎就是直接翻译成Java的字面意思。

C++的模板和Java的泛型之间存在其他差异,但对于你的示例来说,这些差异都不是问题。


4
实际上,C++ 和 Java 之间一个不是通用/模板的本质区别是,在 C++ 中的 set 方法会复制提供的对象,而 Java 版本只会复制引用。 - Laurence Gonsalves
哇,关于“泛型”的酷炫之处在于我甚至可以表达像public class SomeClass<T extends OtherClass>这样的东西!我认为这种能力在C++中是不存在的。太酷了! - sivabudh
3
在C++ stdlib中,普遍使用“鸭子类型”这个成语:“如果对象的所有尝试使用都能正常工作,则它具有预期的接口”(std :: reverse_iterator是一个很好且清晰的示例),这类似于Python和我理解的Go。有时仍然有必要自己添加限制(或者至少人们会要求这样做:P),可以使用boost :: enable_if、静态断言(在这种情况下带有类型特性来检测继承)等进行限制。概念本应该帮助解决这个问题,但这又是另一回事了。 - Roger Pate
2
@ShaChris23 is_base_of 正好做到了这一点,更不用提 C++ 模板拥有无数 Java 泛型所没有的能力,它们是图灵完备的,我认为这是 C++ 最好的特性之一。 - aaronman
@aaronman is_base_of 在 C++11 中被添加,但 ShaChris23 的评论是在2009年发表的。换句话说,在他发表评论时它不是(标准)C++ 的一部分。 - Laurence Gonsalves

6
你可以在Java中使用“泛型”来实现这一点:
public class SomeClass<T> {
  private T data;

  public SomeClass() {
  }

  public void set(T data) {
    this.data = data;
  }
};

维基百科对于Java中的泛型有一个很好的描述。


3
/**
 * This class is designed to act like C#'s properties.
 */
public class Property<T>
{
  private T value;

  /**
   * By default, stores the value passed in.
   * This action can be overridden.
   * @param _value
   */
  public void set (T _value)
  {
    value = _value;
  }

  /**
   * By default, returns the stored value.
   * This action can be overridden.
   * @return
   */
  public T get()
  {
    return value;
  }
}

1
public class GenericClass<T> {
    private T data;

    public GenericClass() {}

    public GenericClass(T t) {
        this.data = t;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    // usage 
    public static void main(String[] args) {
        GenericClass<Integer> gci = new GenericClass<Integer>(new Integer(5)); 
        System.out.println(gci.getData());  // print 5; 

        GenericClass<String> gcs = new GenericClass<String>(); 
        gcs.setData("abc");
        System.out.println(gcs.getData());  // print abc;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接