小编ege*_*lev的帖子

Java多类型方法参数?

我想知道是否有可能要求java方法参数是有限类型的任何类型.例如 - 我使用的库中有两个(或更多)类型具有常用方法,但它们在类型层次结构中的最低共同祖先是Object.我的意思是:

   public interface A {
      void myMethod();
   }

   public interface B {
      void myMethod();
   }
...
   public void useMyMethod(A a) {
      // code duplication
   }

   public void useMyMethod(B b) {
      // code duplication
   }
Run Code Online (Sandbox Code Playgroud)

我想避免代码重复.我的想法是这样的:

   public void useMyMethod(A|B obj){
      obj.myMethod();
   }
Run Code Online (Sandbox Code Playgroud)

java中已有类似的语法类型.例如:

  try{
     //fail
  } catch (IllegalArgumentException | IllegalStateException e){
     // use e safely here
  }
Run Code Online (Sandbox Code Playgroud)

显然这是不可能的.如何使用这种类型的不可编辑类型层次结构来实现设计良好的代码?

java design-patterns code-duplication

17
推荐指数
4
解决办法
8817
查看次数

如何在java中访问匿名外部类的"this"引用

我有以下问题.两个嵌套的匿名类型.我想访问最内层类中的外部匿名类的"this"引用.通常,如果在命名的外部类中有一个匿名嵌套类(让我们称之为"类外部"),他/她将在嵌套类中键入内容Outer.this.someMethod().如果它是匿名的,我如何引用外部类?示例代码:

public interface Outer {
    void outerMethod();
}

public interface Inner {
    void innerMethod();
}
...
public static void main(String[] args) {
...
new Outer() {
    public void outerMethod() {
        new Inner() {
            public void innerMethod() {
                Outer.this.hashCode(); // this does not work
            } // innerMethod
        }; // Inner
    } // outerMethod
}; // Outer
...
} // main
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

在范围内无法访问Outer类型的封闭实例

我知道我可以像这样复制引用:

final Outer outerThisCopy = this;
Run Code Online (Sandbox Code Playgroud)

在实例化Inner对象之前,然后引用此变量.真正的目标是我想比较hashCodes outerThisCopy和对象内部访问的new Inner对象(即Outer.this)以进行调试.我有一些很好的论据认为这两个对象是不同的(在我的例子中).[上下文:参数是调用在"外部"类中实现的getter,它在"Inner"类中没有阴影,返回不同的对象]

任何想法如何访问封闭匿名类型的"this"引用? …

java closures anonymous-types

12
推荐指数
1
解决办法
3082
查看次数

Java泛型:<B扩展BaseB>不匹配<?扩展BaseB>

我有两个同构类型的层次结构.第一个的基本类型是BaseA,第二个的基本类型是BaseB.我知道如何将BaseB的任何子类的任何对象转换为其对应的BaseA子类型.我想实现一个方法,它接受BaseB类型的对象确定其类并构造相应的BaseA子类型的对象.示例代码:

public interface BaseA...
public interface BaseB...
public class DerA implements BaseA...
public class DerB implements BaseB...
...
public interface Transform<A,B> {
    A toA (B b);
}

public class DerAtoDerB implements Transform<DerA,DerB> {
    DerA toA (DerB b){...}
}

public class Transformations {
    private static Map<Class<?>, Transform<? extends BaseA, ? extends BaseB>> _map = 
        new HashMap<>();
static {
    _map.put(DerB.class, new DerAtoDerB());
    }

public static <B extends BaseB> BaseA transform(B b){
    Transform<? extends BaseA, ? extends BaseB> t = _map.get(b.getClass());
    return t.toA(b); …
Run Code Online (Sandbox Code Playgroud)

java generics

5
推荐指数
1
解决办法
589
查看次数

为什么允许声明一个C函数没有指定返回类型?

我很惊讶地发现这是C中的有效函数声明:

f() {
    return 10; 
}
Run Code Online (Sandbox Code Playgroud)

未指定函数的返回类型.它不仅编译,而且实际上返回10.

void main() {
        int i = f();
        printf("i = %d\n", i); 
}
Run Code Online (Sandbox Code Playgroud)

此代码导致以下输出:

i = 10
Run Code Online (Sandbox Code Playgroud)

这是用gcc 4.8.4编译的.为什么没有明确指定的返回类型的函数声明编译而没有错误/警告?

编辑:作为解释这里的返回类型不是函数签名的一部分,你不能超载根据不同的返回类型的功能,但问题是,需要返回类型函数声明不回答.

c function

0
推荐指数
1
解决办法
492
查看次数