首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中的延迟静态绑定

Java中的延迟静态绑定
EN

Stack Overflow用户
提问于 2018-08-05 06:57:30
回答 1查看 91关注 0票数 2

PHP有一个称为后期静态绑定的特性,其中static关键字在运行时被解析,并引用当前正在执行代码的类。考虑以下PHP代码:

代码语言:javascript
复制
class Collection
{
    protected $items;

    public function __construct(array $items = [])
    {
        $this->items = $items;
    }

    public function map(Closure $closure)
    {
        return new static(array_map($closure, $this->items));
    }
}

class CatCollection extends Collection {}

如果我们要创建一个Collection实例,我们将能够调用它的map方法,这将返回一个Collection实例。类似地,我们可以创建一个CatCollection实例并调用它的map方法,这将生成一个新的CatCollection实例(而不是Collection)。

代码语言:javascript
复制
$collection = new Collection([1, 2, 3]);
$doubled = $collection->map(function ($item) {
    return $item * 2;
}); // Returns an instance of Collection containing items 2, 4, 6.

$cats = new CatCollection(['Keyboard', 'Grumpy']);
$titled = $cats->map(function ($cat) {
    return 'Mr. ' . $cat;
}); // Returns an instance of CatCollection containing items 'Mr. Keyboard', 'Mr. Grumpy'.

  • 有可能在Java中做这样的事情吗?也就是说,让父类定义功能,以便当它在子类的上下文中执行时,它使用父类的实现在子类的上下文中操作(类似于上面的PHP示例)。我相当确信,如果不使用反射或某种黑客攻击,这是不可能的。
  • 开发人员是否经常使用一些技术或模式来实现相同或类似的结果?
EN

回答 1

Stack Overflow用户

发布于 2018-08-05 08:45:45

你可以用一些普通的愚蠢的东西来做这样的事情。

(在下面,EMyCollection的元素类型,CMyCollection的扩展类型。)

代码语言:javascript
复制
abstract class MyCollection<E, C extends MyCollection<E, C>> {

    private final List<E> elements;

    MyCollection(final List<E> elements) {
        this.elements = new ArrayList<>(elements);
    }

    C map(final UnaryOperator<E> mapper) {
        final List<E> mappedElements = new ArrayList<>(this.elements.size());
        for (final E element : this.elements) {
            mappedElements.add(mapper.apply(element));
        }

        return this.create(mappedElements);
    }

    abstract C create(final List<E> mappedElements);
}

class SubCollection<E> extends MyCollection<E, SubCollection<E>> {

    SubCollection(final List<E> elements) {
        super(elements);
    }

    @Override 
    SubCollection<E> create(final List<E> mappedElements) {
        return new SubCollection<>(mappedElements);
    }
}

我想不出有哪一次我不得不做这样的事情...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51690144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档