我想知道是否有可能要求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)
显然这是不可能的.如何使用这种类型的不可编辑类型层次结构来实现设计良好的代码?
我有以下问题.两个嵌套的匿名类型.我想访问最内层类中的外部匿名类的"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"引用? …
我有两个同构类型的层次结构.第一个的基本类型是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) 我很惊讶地发现这是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编译的.为什么没有明确指定的返回类型的函数声明编译而没有错误/警告?
编辑:作为解释这里的返回类型不是函数签名的一部分,你不能超载根据不同的返回类型的功能,但问题是,需要返回类型函数声明不回答.