【问题标题】:can anonymous inner classes extend?匿名内部类可以扩展吗?
【发布时间】:2012-02-14 08:43:04
【问题描述】:

我想创建一个匿名内部类来扩展另一个类。

我想要做的实际上是这样的:

for(final e:list){

        Callable<V> l = new MyCallable(e.v) extends Callable<V>(){
              private e;//updated by constructor
                        @Override
                    public V call() throws Exception {
                        if(e != null) return e;
                        else{
                          //do something heavy
                        }

                    }               
        };
        FutureTask<V> f = new FutureTask<V>(l);     
        futureLoadingtask.run();
        }
}

这可能吗?

【问题讨论】:

  • 不管怎样,你为什么不想定义一个常规类呢?
  • 如果不可能,我会这样做
  • 我建议在这里定义一个常规类。你不能仅仅因为你可以而使用匿名类。当它降低代码复杂度而不是增强它时,必须使用它。
  • 你尝试的时候发生了什么?

标签: java inheritance concurrency inner-classes


【解决方案1】:

你不能给你的匿名类命名,这就是它被称为“匿名”的原因。我看到的唯一选择是从Callable 的外部范围引用final 变量

// Your outer loop
for (;;) {

  // Create some final declaration of `e`
  final E e = ...
  Callable<E> c = new Callable<E> {

    // You can have class variables
    private String x;

    // This is the only way to implement constructor logic in anonymous classes:
    {     
      // do something with e in the constructor
      x = e.toString();
    }  

    E call(){  
      if(e != null) return e;
      else {
        // long task here....
      }
    }
  }
}

另一种选择是像这样定义一个本地类(不是匿名类):

public void myMethod() {
  // ...

  class MyCallable<E> implements Callable<E> {
    public MyCallable(E e) {
      // Constructor
    }

    E call() {
      // Implementation...
    }
  }

  // Now you can use that "local" class (not anonymous)
  MyCallable<String> my = new MyCallable<String>("abc");
  // ...
}

如果您需要更多,请创建一个常规的 MyCallable 类...

【讨论】:

  • 这行不通,因为我在一个循环中创建了一系列Future,每个可能有也可能没有e
  • @Jim:它可以工作。我会更新我的代码。也许你也应该更新你的,把我们放在更大的背景下?
  • @Jim:我明白了。因此,任何类型的匿名、本地或常规内部类都适合您
  • 为了清楚起见,我试图匿名。我不想重用它们。所以我可以在你的第一个例子中用括号模仿构造函数?
  • @Jim:这不是“模仿构造函数”,而是称为Instance Initializers specified in §8.6 of the JLS 的Java 语言的一个特性。一个example can be found here
【解决方案2】:

extends 关键字只允许在类定义中使用。不允许在匿名类中。

匿名类定义是:类没有任何名称,声明后不要使用。

我们必须将您的代码更正如下(例如):

Callable<String> test = new Callable<String>()
{
    @Override
    public String call() throws Exception
    {
        return "Hello World";
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2017-08-15
    • 1970-01-01
    • 2011-07-06
    相关资源
    最近更新 更多