我有一个控制台应用程序的主线程,以这种方式运行很少的外部进程
private static MyExternalProcess p1;
private static MyExternalProcess p2;
private static MyExternalProcess p3;
public void Main() {
p1 = new MyExternalProcess();
p2 = new MyExternalProcess();
p3 = new MyExternalProcess();
p1.startProcess();
p2.startProcess();
p3.startProcess();
}
public static void killEveryoneOnExit() {
p1.kill();
p2.kill();
p3.kill();
}
class MyExternalProcess {
private Process p;
...
public void startProces() {
// do some stuff
PlayerProcess = new Process();
....
PlayerProcess.Start();
// do some stuff
}
public void kill() {
// do some stuff
p.Kill();
}
}
Run Code Online (Sandbox Code Playgroud)
我需要做的是:当主线程被中断时(退出按钮或ctrl …
我正在应对一种情况,我希望有一个类型的通用
MyGeneric<T extends A | B>
Run Code Online (Sandbox Code Playgroud)
即镜像的东西
MyGeneric<T extends A & B>
Run Code Online (Sandbox Code Playgroud)
.如果B是接口,则允许最后一个; 不接受B作为类的原因是Java不显式支持多重继承.
从接受两种类型中的任何一种的Generic类中,我得到确认,我对Java的OR子句的猜测是不可接受的.这意味着我对OR子句的猜测在语法上是不正确的,无论B是类还是接口.所以我想知道为什么Java不支持这个.有没有比"未实施"更强的理由?
- -编辑 - -
当然有很多情况下OR子句可能引起怀疑(见评论和答案),但看看我的情况:
public abstract class MyAbstractTask<T extends MyAbstractCommand> {
@Override
final protected void onPostExecute(String result) {
super.onPostExecute(result);
if (result != null) {
T response = null;
Gson gson = new Gson();
response = gson.fromJson(result, clazz);7
postProcess(response);
}
}
abstract void postProcess(T task);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我正在应用模板方法模式+命令模式.所以T是命令,postProcess负责运行它.
现在我可以拥有类似的东西
public class MyTask extends MyAbstractTask<MyCommand> {...}
Run Code Online (Sandbox Code Playgroud)
这很酷.
但是,假设您创建了一个"YourCommand"类.如果它与MyAbstractCommand无关,我不得不复制报告的代码或创建由两个抽象命令实现的公共接口或让YourCommand扩展MyAbstractCommand.如果支持OR子句,我可以将YourCommand添加到我的泛型的接受参数类型列表中.
我的主要活动中有以下代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fabric.with(this, new Crashlytics());
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
MyClass[] arr = MyClass.values();
System.out.println(Arrays.deepToString(arr));
Run Code Online (Sandbox Code Playgroud)
我的类如下:
public class MyClass {
public static MyClass A;
public static MyClass B;
public static MyClass C;
static {
System.out.println("Invoked");
A = new MyClass("a");
B = new MyClass("b");
C = new MyClass("c");
}
private static Map<String, MyClass> values = null;
private final String name;
private MyClass(String name) {
this.name = name;
if (values == null)
values = new …Run Code Online (Sandbox Code Playgroud) 以下代码不起作用,因为标记的行不能编译:
MyClass {
//singleton stuff
private static MyClass instance;
private MyClass () {}
public static MyClass getInstance() {
if(instance==null) {
instance = new MyClass ();
}
return instance;
}
// method creating problems
public NonGenericSuperClassOfGenericClass create(Class<?> c1, Class<?> c2) {
return new GenericClass<c1,c2>; // DOES NOT COMPILE!!!
}
}
Run Code Online (Sandbox Code Playgroud)
我不希望MyClass成为通用的.为什么?因为create方法的实际实现类似于以下内容:
// method creating problems
public NonGenericSuperClassOfGenericClass create(Class<?>... classes) {
if(someCondition)
return new GenericClass<classes[0],classes[1]>;
else
return new OtherGenericClass<classes[0]>;
}
Run Code Online (Sandbox Code Playgroud)
因此,我无法将MyClass与任何特定的泛型相结合.有没有办法用传递的参数实例化我的GenericClass?怎么样?
谢谢
谢谢您的回答.我会告诉你整个故事.
我正在使用Spring,我计划使用MongoDB.
GenericClass类是这样的:
GenericClass<PersistetType1, Long>
Run Code Online (Sandbox Code Playgroud)
要么 …