返回一个Void对象

问题描述:

当它不是一个原始类型时,返回Void类型的正确方法是什么?例如。我目前使用null如下。返回一个Void对象

interface B<E>{ E method(); } 

class A implements B<Void>{ 

    public Void method(){ 
     // do something 
     return null; 
    } 
} 
+1

你需要什么? – Bozho 2010-03-09 11:34:14

+1

我正在使用解释器模式为文件格式编写解释器,但某些表达式没有返回值 – Robert 2010-03-09 11:36:33

+2

无法实例化Void类型,因此如果您确实必须返回某种类型的值,则为null你唯一的选择。但是,你可能不需要任何返回值,所以null应该没问题。 – Jorn 2010-03-09 11:52:47

Void类是一个不可实例化占位符类保持于表示Java关键字空隙类对象的引用。

因此,任何以下的就足够了:

  • 参数化与Object和返回new Object()null
  • 参数化与Void和与你的NullObject
返回 null
  • 参数化

    您不能使此方法void,而其他任何返回东西。由于某些东西被忽略,你可以返回任何东西。

  • +2

    那么实现返回类型void的一般正确方法是什么? – Robert 2010-03-09 11:40:00

    +0

    @Robert查看我的更新 – Bozho 2010-03-09 12:05:53

    +0

    如果你想返回null作为void,你需要在某些情况下抛出它:(void)null – for3st 2016-03-29 10:04:45

    没有通用类型告诉编译器一个方法什么都不返回。

    我相信习惯是使用对象作为参数类型继承

    OR

    传播类型参数了,然后你的类实例化的用户使用对象和分配对象给一个变量类型化让当使用类型通配符?

    interface B<E>{ E method(); } 
    
    class A<T> implements B<T>{ 
    
        public T method(){ 
         // do something 
         return null; 
        } 
    } 
    
    A<?> a = new A<Object>(); 
    
    +1

    这是将返回类型设置为void的惯例 - 它看起来不是很有效对我来说? – Robert 2010-03-09 11:48:15

    +0

    我相信这是要走的路。 “A >”类的任何用户将无法使用方法()的返回值。 – 2010-03-09 11:56:29

    如果你只是什么都不需要为你的类型,你可以使用无效。这可以用于实现功能或操作。那么你可以做这样的事情:

    interface Action<T> { 
        public T execute(); 
    } 
    
    abstract class VoidAction implements Action<Void> { 
        public Void execute() { 
         executeInternal(); 
         return null; 
        } 
    
        abstract void executeInternal(); 
    } 
    

    或者你可以省略抽象类,并做回空的,不需要自己一个返回值的每一个动作。

    然后,您可以使用这些操作是这样的:

    给出的方法

    private static <T> T executeAction(Action<T> action) { 
        return action.execute(); 
    } 
    

    你可以这样调用它

    String result = executeAction(new Action<String>() { 
        @Override 
        public String execute() { 
         //code here 
         return "Return me!"; 
        } 
    }); 
    

    ,或者为无效动作(注意,你”不要将结果分配给任何东西)

    executeAction(new VoidAction() { 
        @Override 
        public void executeInternal() { 
         //code here 
        } 
    }); 
    
    +2

    这与我已有的有何不同?它仍然只是返回null,就像我建议 – Robert 2010-03-09 11:51:52

    +0

    为什么你必须返回其他东西?我试图做的一点是你不需要返回值,所以你返回什么并不重要。我试图澄清,与我的编辑。 – Jorn 2010-03-09 11:58:05

    Java 8引入了一个新类,Optional<T>,可以在这种情况下使用。要使用它,你会略微修改代码如下:

    interface B<E>{ Optional<E> method(); } 
    
    class A implements B<Void>{ 
    
        public Optional<Void> method(){ 
         // do something 
         return Optional.empty(); 
        } 
    } 
    

    这使您可以确保您始终你的方法获得一个非空返回值,即使没有什么返回。当与检测null何时可以退货或不能退货的工具一起使用时,这特别有用。 Eclipse @NonNull@Nullable注释。

    +1

    我的意见是,这是错误的方向。返回一个更加约束的类型会更好地传达更清晰的意思。有一件事返回一个'可选'是不必要的,因为你给的同一个理由,你会得到一个空的'可选',因此所有其他方法都是毫无意义的。这与为什么应该使用可选值相反。您使用它,因为它可能有或没有价值。而且编译器不能强制'method()'正确地实现它。这在运行时会失败:'return Optional.of(null)'。 – Steiny 2017-03-09 20:58:46