É natural pegarmos alguns “vícios” de linguagem quando ficamos muito tempo na linguagem A e mudamos para a B.
Eu fiquei muito tempo criando procedures para SQL Server, fui entrar num projeto com MySQL e só Deus sabe como sofri, eu não sabia sair da proc em MySQL só pq ele não deixava eu usar return, coisa que era banal em SQL Server. Também não achei nada parecido com raiserror.
Com isso aprendi que, quando mudamos de linguagem, temos que nos adaptar à nova, tentando nos desvincular dos vícios da anterior.
Mas, a respeito do seu problema, não conheço nada parecido no Java (na verdade nem sabia que exista no C#), o que você pode fazer é criar uma variável do tipo Object e atribuir o valor que você quiser para essa variável, embora o ideal é que você sempre saiba com que tipo de dado você está lidando.
Object a = 4;
Object b = "String qualquer";
Object c = new Abc();
Object d = new ArrayList<Object>();
Mas isso que você fez acima lhe traz um sério problema, se tentar acessar, por exemplo, o método add (presente na interface List) do objeto apontado por d, vc terá esse erro "The method add(String) is undefined for the type Object ". Ou seja, você terá sempre que fazer um cast, algo como…
code.add(“blabla”);[/code] Sendo que isso ainda vai gerar um warning do compilador. Além disso, para fazer essa conversão, você precisa saber o tipo da variável d, coisa que você não sabe, já que a declarou como Object justamente por isso.
Por isso que falei acima que precisamos mudar algumas formas que temos de pensar quando também mudamos de linguagem.